关于ARC的一些说明

来源:互联网 发布:工程进度控制软件 编辑:程序博客网 时间:2024/05/09 03:11

文章开头不废话去说明关于ARC的说明,简单记录一下在使用过程中的一下需要注意的点。

1,变量的属性

在ARC的环境下,建议使用strong替代retian,由于没有很好的实例去展示它们的区别,所以也说不出个所以然。习惯比较好的写法是,关于retain全部替换为strong,关于assign如果是object则使用weak替换如果是基本数据类型,或者C的类型,则继续沿用assign。 copy不变,nsstring依旧习惯使用copy


2,关于block

block语法越来越多的被大家运用到,最简单一点它可以大量减少我们的编码量。由于block的本质是函数指针,虽然强大的clang库很好去支持了该语法,但是在内存处理方面,我们还是面临了许多表面上看不到的问题,不详细说明block语法。简单说说在ARC中使用block需要注意的一些问题。

大家都知道很多时候为了防止循环引用,我们会使用修饰符__block去解决循环retain的问题,类似__block typeof(self) b_self = self这样的写法来指定这个b_self是一个弱引用,但是__block在ARC和非ARC中有一些差别:在ARC中使用__block无法解除循环retain,在ARC的环境下,需要使用修饰符__weak。如果是在iOS5以下,则没有__weak,我们可以使用__unsafe_unretained。

同样,在ARC的环境下,如果在block中访问当前的类的成员变量,依旧会引起循环retain,所以需要注意这个问题。


3,有关CFObject对象

在ARC的环境下 CFObject和NSObject需要转换,

由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之间,我们需要使用到__bridge,__bridge_retained和__bridge_transfer三个转换关键字。

__bridge只做类型转换,但是不修改对象(内存)管理权;


__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;

__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

0 0