使用属性关键字前,需要先理解属性关键字的作用。其实《简单来说...》就是指导底层如何生成set、get方法的,如果不自己定义set、get方法,系统将会自动为你生成,但如何生成依据的就是这些属性关键字,不同的属性关键字的组合将决定set、get方法的具体实现,实现不同,功能自然也就不同了...
----------------------------------------------------------------------------------------------------------------------------------------
ARC:
1、assign:基本数据类型、枚举、结构体等非OC对象类型。
2、strong/retain:使用必须满足两个条件,一是必须是OC对象类型,二是需要被强引用不能‘随便‘释放。
3、weak:
1)别人创建别人拥有,你只是借用一下而已,随时可能会不见,但不见的时候你可以发现。
2)使用时必须满足两个条件,一是必须是OC对象类型,二是自己不直接拥有的对象。比如delegate,parentviewcontroller等,以防止循环引用。
3)weak有一个大招,就是当所指对象被释放的时候会自动置为nil。实现的原理《简单来说...》就是每一个strong维护一个weaktable,当把一个strong对象赋值给weak对象时,weaktable中就记录该weak对象,当strong释放时就把weaktable中所有的对象取出来挨个置为nil。
4、copy:用于block。用于NSString、NSDictionary、NSArray等有Mutable类型的类,此处可以理解为(copy=不可变)。经过测试后发现当把NSString对象赋给copy类型的NSString时,地址未发生改变相当于浅拷贝和strong效果一样,但把NSMutableString赋给copy类型的NSString时地址发生改变,此处相当于深拷贝。
5、readonly/readwrite:只读/可读写.
6、atomic/nonatomic:原子操作/非原子,《简单来说...》就是是否线程安全,但通过此方法来保证线程安全开销是很大滴,如果条件允许还是在适合的地方加锁靠谱。
7、getter/setter:以上都无所谓了,自己写set、get方法。
----------------------------------------------------------------------------------------------------------------------------------------
MRC:
1、assign:基本数据类型、枚举、结构体等非OC对象类型。也可用于delegate\parentviewcontroller等不直接拥有的对象,作为MRC下weak的替代品。
2、retain:使用必须满足两个条件,一是必须是OC对象类型,二是需要被强引用不能‘随便‘释放。
3、unsafe_unretained:
1)别人创建别人拥有,你只是借用一下而已,随时可能会不见,并且不见的时候连个招呼都不打。与ARC中weak的区别就是不会自动置为nil。
2)使用时必须满足两个条件,一是必须是OC对象类型,二是自己不直接拥有的对象。
3)与assign的唯一区别就是不能用于基本数据类型。
4、copy:用于block。用于NSString、NSDictionary、NSArray等有Mutable类型的类,此处可以理解为(copy=不可变)。经过测试后发现当把NSString对象赋给copy类型的NSString时,地址未发生改变相当于浅拷贝和strong效果一样,但把NSMutableString赋给copy类型的NSString时地址发生改变,此处便想当于深拷贝了。
5、readonly/readwrite:只读/可读写.
6、atomic/nonatomic:原子操作/非原子,《简单来说...》就是是否多线程安全,但通过此方法来保证多线程安全开销是很大滴,如果条件允许还是在适合的地方加锁靠谱。
7、getter/setter:以上都无所谓了,自己写set、get方法。