关于IOS属性关键字的一些理解和笔记,对于weak,strong,assign,nonatomic,natomic等的一些思考,如有错误之处,请指正!
原子性:natomic
该属性为默认属性,在多线程操作下,一个实例变量在某一时刻,只有一个线程访问 。即变量的存取是互斥锁定的。(不一定线程安全)非原子性: nonatomic
nonatomic特质的变量可以直接返回值,不受线程的影响,所以在执行效率上更快。读/写权限:readwrite(读写)、readonly (只读)
从字面上就能理解readonly值具有get方法,readwrite具有get和set方法。
下面的内存管理语义才是重点!!
-
retain :
使引用计数加1(MRC环境下,相当于ARC环境下的Strong,对MRC有畏惧感,不是很了解) -
assign(基本数据类型默认关键字):
直接赋值,适用于基本数据类型(bool,int,cgfloat等),不会使retainCoun加1,只是简单的赋值。(在MRC和ARC的环境下,都是使用默认assign修饰基本数据类型) -
strong :
每次对属性引用,retainCount都会加1,不用能与修饰基本数据类型,是NSObject和id的默认修饰符。 -
weak:
不会使retainCount增加,只用于修饰NSObject,不能用于修饰基本数据类型。(delegate和控价都推荐使用weak,防止循环引用)在对象被销毁以后,指针指向nil。 -
copy:
建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。这里分为深拷贝和浅拷贝(block建议使用copy,block建立的时候是放在栈上的,调用完毕以后就会被销毁,使用copy将其放在堆上,只有在对象销毁的时候才会销毁)
深拷贝:浅拷贝类似retain,引用计数对象+1.创建一个指针。也就是说,不仅改变值,还改变指正指向的内存地址;
浅拷贝:只改变指针指向的地址。即只拷贝了原对象的指针。
weak和assign的区别
weak 和 assign 最大的区别在于,weak修饰的属性指向的对象被销毁后自动指向nil,再向weak修饰的属性发消息的时候,不会造成野指针,防止carh。并且weak只能修饰对象,assign修饰基本数据类型。