// Person复合了Phone和Room

 

// 第一种:比较合理

先判断对象形参传递的对象和原属性是否一致,不一致在释放旧值,给形参传递的值retain,因为retain方法会返回该对象,因此可以直接接收

- (void)setPhone:(Phone *)phone

{

    if (phone != _phone)

    {

        [_phone release];

        _phone = [phone retain];

    }

}

 

 

 

// 第二种

比较直观:不管对象是否一致,先对形参传递的对象retain,释放掉属性的旧值,再把形参传递的值赋给属性(不是很完美)

- (void)setRoom:(Room *)room

{

    [room retain];

    [_room release];

    _room = room;

}

 

- (void)dealloc

{

    NSLog(@"%s", __func__);

    

 

 

    

给该属性赋值,就会调用setter访问器

    self.phone = nil; 

// 等效的

    [_room release];

    _room = nil;

 

但是不等效的[_room release]; 只有的操作只是是本类的.m文件中直接对属性进行访问,没有调用到setter

注意:如果需要在setter访问器中需要对赋值进行屏蔽,那么如果是在.m通过_属性名的方式是不能成功的,使用self.属性名会调用访问器:即使在.m文件中赋值也可以屏蔽

(在本类中封装方法时,给本类属性赋值如果需要屏蔽或者过滤,注意需要使用点语法来调用方法)

 

    

    [super dealloc];

}

posted on 2016-03-03 21:40  pruple_Boy  阅读(221)  评论(0编辑  收藏  举报