OC 中property属性详解(assign , retain , copy , strong,weak,readonly , readwrite , atomic , nonatomic)

Objective-C 属性特性@property详解   

目录

Objective-C 属性特性@property详解     

1.assign

2.retain

3.copy

4.strong

5.weak

6.readonly

7.readwrite

8.atomic

9.nonatomic

1.assign

setter方法将传入参数赋值给实例变量,仅设置变量时,assign适用于基本数据类型,并且是一个弱引用。assign其实也可以用来修饰对象。那么我们为什么不用它修饰对象呢?因为被assign修饰的对象(一般编译的时候会产生警告:Assigning retained object to unsafe property; object will be released after assignment)在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,造成野指针。对象一般分配在堆上的某块内存,如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。

那为什么可以用assign修饰基本数据类型?因为基础数据类型一般分配在栈上,栈的内存会由系统自己自动处理,不会造成野指针。

2.retain

表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1; 

3.copy

 表示拷贝特性,setter方法将传入对象在内存里拷贝一份,两个指针指向不同的内存地址,需要完全一份新的变量时。在 MRC 时是这样做的 release 旧对象( 旧对象的引用计数器 -1 ) , copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 (新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)。在 ARC 时 copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 。

注意 :例如 NSMutableArray 采用 copy 修饰 , 添加元素表面上可以 一到运行就崩溃了 , 因为 copy 过后实际上成了NSArray了 . 那么此时,需要用到mutablecopy。遵守 NSCopying 协议的对象使用 。

4.strong

强引用,会使引用计数器+1,两个指针指向同一个内存地址,在ARC下(替代了 retain 的作用),一个对象没有强引用指向时,系统会释放这个对象 

5.weak

弱引用,不会使引用计数器+1,weak修饰的对象在释放之后,指针地址会被置为nil。 

weak使用场景:

在ARC下,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如: delegate代理属性,通常就会声明为weak。自身已经对它进行一次强引用,没有必要再强引用一次时也会使用weak。比如:自定义 IBOutlet控件属性一般也使用weak,当然也可以使用strong。

6.readonly

只读属性,只生成getter方法,也就是说只能访问变量,不能修改 。

7.readwrite

默认属性,可读可写,生成setter和getter方法。 

8.atomic

原子性,属性安全级别的表示,同一时刻只有一个线程访问,具有资源的独占性,但是效率很低。对set 方法加互斥锁 @synchronized(锁对象) 。互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 ,其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 。 

9.nonatomic

非原子性,可以多线程访问,效率高,不对set方法加锁 ,性能好,线程不安全,貌似苹果官方推荐使用。

 

你可能感兴趣的:(iOS)