Property 常见修饰符

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值