objective-c内存管理ARC关键字概述

来源:互联网 发布:淘宝网十二伏鹰眼灯 编辑:程序博客网 时间:2024/06/14 04:35

简单来讲,只要记住strong和weak就可以了,局部变量使用__strong和__weak,至于unsafe_unretained是之前低版本时对weak不支持时的weak替代方案,weak比unsafe_unretained安全。

一般情况下都用strong,可能存在循环引用或者只是想获取一下对方的指针,并不想因获取而使对方无法释放内存的情况下,使用weak。

对于局部变量,默认是strong,所以一般不用管,只有属性变量,因为默认是unsafe_unretained的,因此一般都要去指定为weak或者strong。

所以总结起来就一点:属性变量要指定strong或weak。

1.strong

strong与之前的retain差不多,可以增加属性引用计数的值。在不需要的时候,需要手动设置属性为nil。

2.weak
weak是iOS5及以上才支持的修饰符。它被称为“归零弱引用”。可以只是持有指针而不增加引用计数来避免循环保留。当指针指向的内存被销毁后,声明weak的属性指针会自动置为nil,这也是它被称为归零弱引用的原因。

3.unsafe_unretained
对于iOS5以下版本,并不支持ARC中的weak声明,可以用unsafe_unretained声明来代替weak。unsafe_unretained同样也是不增加引用计数的值,但它没有“归零”的动作,需要手动操作,一般作为支持iOS5以下weak的替代方案。

4.__autoreleasing

对于函数中作为函数返回值的局部变量,需要使用__autoreleasing声明该局部变量;当你想传一个未初始化地对像引用到一个方法当中,在此方法中实始化此对像,那么这种情况函数声明时需要在变量前加上__autoreleasing,如- (void) generateErrorInVariable:(__autoreleasing NSError **)paramError

0 0