再战 OC @property属性

2016-03-10  本文已影响1409人  xiao_A

@property是OC中用到的,最重要的key words。
我们经常看到assign,retain,copy和strong,weak nonatomic等关键字出现在它之后。这个背后必然有各种阴谋,必须弄清,不然又是个坑的节奏。

非ARC环境

现在基本都用ARC了,不过一切都是有发展轨迹的,最新的技术也是从这个发展过来的。

assign属性

assign做的事情其实就是拷贝了指针。让这个属性只是复制你所赋给它的值的指针。于是,它们就共同指向了同一个区域了。
当数据类型为int、float等原生类型时,可以使用assign,否则可能导致内存泄露。例如当使用malloc分配了一块内存,并把它的地址赋值给了指针a,后来如果希望指针b也共享这块内存,于是讲a赋值给(assgin)b。这时就用到了assgin,此时a和b指向同一块内存。但是现在问题出现了,当a不再需要这块内存时,能都直接释放呢?肯定是不能的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候引起程序crash掉。
一般,assign对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, [double] 等简单数据类型适用

retain属性

retain属性就是为了解决上述问题而提出的,使用了引用计数(reference counting),还是上面那个例子,我们给那块内存设一个引用计数,当内存呗分配并且赋值给a时,引用计数是1.当把a赋值给b时引用计数增加到2.这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1.当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以直接释放掉。此时系统自动调用dealloc函数,内存被回收。
所以因为和引用计数相关,所以必须是支持引用计数的对象才行。一般是NS系的复杂对象玩意才能比较好的用这个。

copy属性

copy就是新创建一块内存区域,复制变量的内容进来。只是保证了变量的内容相同,内存区域并不同。
这里还涉及 深拷贝和 浅拷贝 相关的知识。

ARC环境

ARC环境下,strong代替retain.weak代替assign

weak(类似assign)

在ARC环境下,对象的销毁不会受到weak指针的指向而不被销毁。
同时,所有指向销毁对象的weak指针都将被置为nil。这个特性很有用,相信很多开发者都被指针指向已释放的对象所造成的EXC_BAD_ACCESS困扰过,使用ARC以后,不论是strong还是weak类型的指针,都不会再指向一个已经销毁的对象,从根本上解决了意外释放导致的crash。

strong(类似retain)

在ARC环境下,只要某一对象被一个strong指针指向,该对象就不会被销毁。如果对象没有被任何strong指针指向,那么就会被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上跟非ARC下得retain是比较相似的

weak和strong的区别

  1. weak 和 strong 属性只有在你打开ARC时才会被要求使用,这时你是不能使用retain release autorelease 操作的,因为ARC会自动为你做好这些操作,但是你需要在对象属性上使用weak 和strong,其中strong就相当于retain属性,而weak相当于assign。
  2. 只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)
  3. 声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。

其他属性

读写

原子属性

@property的默认属性

readwrite,atomic(即不写nonatomic)
非ARC环境下, 默认为assign
在ARC环境下,默认为strong

上一篇 下一篇

猜你喜欢

热点阅读