-
修饰符
- copy
- assign
- retain
- strong
- weak
- readwrite/readonly (读写策略、访问权限)
- nonatomic/atomic (安全策略)
- MRC
assign、retain、copy、readwrite、readonly、nonatomic、atomic
- ARC
weak、strong、assign、retain、copy、readwrite、readonly、nonatomic、atomic
-
修饰符的含义解析
-
weak
weak 表示对对象,且只能对对象进行弱引用,被weak修饰的对象随时都可以被系统销毁和回收,对象销毁之后会自动置为nil,防止野指针的产生,可以有效的防止程序的崩溃。被weak修饰的对象,对象的引用计数不会有变化。
- weak的应用场景
1、修饰delegate
2、对block里面有赋值操作的对象进行weak修饰
- 说明
1、assign和weak的区别:当它们指向的对象释放后,weak会自动把对象设置为nil,而assign不会,所以会导致野指针的出现,可能会导致crash。
2、strong和weak的区别:strong表示强引用,weak表示弱引用。strong修饰的对象不会被销毁,weak修饰的对象随时都可以被系统销毁和回收。
-
strong
strong 表示对对象的强引用,对象的引用计数会+1。被strong修饰的对象,不会轻易被系统销毁和释放,只有当我们用完的时候,才会被系统销毁该对象。
- strong的应用场景
修饰对象,如:UIViewController、NSArray、NSMutableArray、UILabel等。
-
assign
assign表示对基本数据类型的修饰,对象的引用计数不会有变化。
-
retain
retain 表示对对象,且只能对对象进行修饰,用在MRC情况下,被retain修饰的对象,引用计数会+1。
- 说明
在MRC下:
1、assign只是简单的赋值操作,它引用的对象被释放,会造成野指针,可能出现crash情况。
2、retain会使对象的retainCount计数加1,获得对象的拥有权,只有对象的引用计数为0的时候才会被释放,避免访问一个被释放的对象。
-
copy
copy一般用于对那些有可变类型的子类的对象进行修饰,因为一个可变类型的对象在赋值时会在内存中重新开辟一个新的内存空间,用来存储新的对象,和原来的对象是两个不同的地址,引用计数会+1。
深拷贝:重新在内存中开辟新空间,新空间对象值与拷贝对象的值一样,但是是完全不同的2个内存地址。
浅拷贝:浅拷贝只是copy了对象的内存地址。
- copy的应用场景
1、修饰NSString、NSArray、NSDictionary等一些有可变类型的子类的对象。
2、修饰block。
-
readwrite和readonly
1、readwrite表示属性可读可写,意思是不仅能读取内容,还能修改内容。
2、readonly表示属性只能读取,不能修改其内容。用readonly修饰的属性,每次只能单独重写setter或getter方法,如果需要同时重写,必须要用synthesize修饰,否则报错。
-
nonatomic和atomic
1、nonatomic:非原子性。nonatomic的特点是多线程并发访问性能高,但是访问是不安全的。
2、atomic:原子性。我们声明属性的时候,系统默认是atomic。atomic的特点是多线程并发访问性能低,但是访问是安全的。不能保证数据的可靠性。
- 说明
nonatomic性能高:因为它直接访问内存中的地址,不关心其他线程是否在改变这个值,并且中间没有死锁保护,它只知道直接从内存中访问到当前内存地址中能用到的数据。
nonatomic不安全:因为用的nonatomic修饰的变量,不同操作可以同时执行,而不需要等前面的操作完成后再进行下一步操作。因此在多线程中,对用nonatomic修饰的变量进行取值,可能取到的完整不具备完整性。
atomic性能低:因为它会根据操作加入线程的顺序一步一步完成操作,就是同步进行。
atomic安全:因为它会对setter方法进行加锁。每当对用atomic修饰的属性操作时,会根据操作加入线程的顺序一步一步完成操作。
扩展
- 1、nullable和nonnull,nonnull和nullable只能修饰对象,不能修饰基本数据类型。
nullable:表示修饰的属性或参数可以为空。
nonnull:表示修饰的属性或参数不能为空。- 2、null_resettable
null_resettable:表示getter方法不能返回空,setter方法可以返回空。- 3、__unsafe_unretained
__unsafe_unretained:表示被修饰过的对象,在init之后对象指针所指向的内存就被释放了,但是它的指针会依然存在,变成了野指针。- 4、release和autorelease和autorelease pool
release:表示释放内存。可以理解为立刻释放。
autorelease:表示自动释放内存。可以理解为等一会自己看情况释放。
注意:release和autorelease都不能对已经释放或者不是自己持有的对象进行释放,不然就崩。
autorelease pool:表示自动释放池。每一条线程,必然都会有一个与之对应的自动释放池,当线程跑完被结束时,它对应的自动释放池就会被销毁。里面的所有对象都会被统一release。
完
特别鸣谢……忘记了是哪些个大神了,记录完了之后直接关掉了浏览器,忘了复制链接,深表歉意呐!本文是参考了很多篇文章加上自己的理解,做出来的笔记,可能有写地方记录的还不是很清晰,重要的是记录,方便以后自己巩固,哪里有不对的地方,希望看管不吝指出,拜谢了!
网友评论