MRC的下setter访问器的两种形式
2016-03-03 21:40
155 查看
// 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];
}
// 第一种:比较合理
先判断对象形参传递的对象和原属性是否一致,不一致在释放旧值,给形参传递的值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];
}
相关文章推荐
- 安装Drupal时导入中文翻译时报错的解决方法
- 9509 开灯
- [iOS]ARC和MRC下混编
- 欢迎使用CSDN-markdown编辑器
- 第一行代码-13.5 编写测试用例
- oracle数据库卸载步骤
- MS Office EXCEL常用函数
- 在vb.net中如何判断字段为null
- 《加州理工学院公开课:机器学习与数据挖掘》第1讲学习笔记
- 数据结构——线性表
- Spark代码1之RDDparallelizeSaveAsFile
- [iOS]修改开发者中心Bundle Identifier的一些配置
- HBase源码分析之HRegion上compact流程分析(二)
- [GDKOI2016]小学生数学题
- 从头到尾彻底解析哈希表算法
- 19.如何修改UITextField的placeholder颜色
- Ext组件化编程是用initcomponent还是constructor
- [iOS]iPhone利用<极光推送>实现远程推送
- Python开源爬虫框架:Scrapy架构分析
- powerbuilder mysql