Property 常见修饰符
读写修饰符
readWrite (Default)
readOnly
多线程特性
atomic (Default)
nonatomic
内存管理
strong (Default)
weak
copy
retain
assign
unsafe_unretained
各修饰符含义
weak:弱引用,对有可能形成循环引用的一方使用,可以打断循环引用。如Delegate以及IBOutlet。
assign: 简单赋值,不更改索引计数(Reference Counting)。适用于基础类型(简单类型,原子类型):NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)
copy: 建立一个索引计数为1的对象,然后释放旧对象。对NSString使用。
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,对其他NSObject和其子类使用。
atomic:Objc使用的一种线程保护技术,防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
关于Copy
NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;
block也经常使用copy关键字,具体原因见官方文档:Objects Use Properties to Keep Track of Blocks:
block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在ARC中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy 也无伤大雅,还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。
这个写法会出什么问题:
@property (copy) NSMutableArray *array;
两个问题:
1、添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃.因为copy就是复制一个不可变NSArray的对象;
2、使用了atomic属性会严重影响性能;在iOS开发中,几乎所有属性都声明为nonatomic。
如何让自己的类用 copy 修饰符?
若想令自己所写的对象具有拷贝功能,则需实现NSCopying协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现NSCopyiog与NSMutableCopying协议。
具体步骤:
1.需声明该类遵从NSCopying协议
2.实现NSCopying协议。该协议只有一个方法:
- (id)copyWithZone: (NSZone*) zone
- (id)copyWithZone:(NSZone *)zone {
Product *copy = [[[self class] allocWithZone: zone]
initWithProductName:[self productName]
price:[self price]];
[copy setDelegate:[self delegate]];
return copy;
}
参考资料:
http://www.jianshu.com/p/1e9294bb75cd 作者:码途
http://www.cocoachina.com/cms/wap.php?action=article&id=13153 作者:kissgod