ARC就是自动引用计数,在ARC之前,我们都是通过手动管理引用计数的,也就是手动使用release和retain来是引用计数减1或者加1,ARC其实还是使用release和retain,只不过系统帮你完成而成。
Clang语1言扩展很有强的类函数宏,可以使用以下代码声明编译时支持ARC而文件代码不支持ARC
#if !__has__feature(objc_arc)
- (void)release
{ };
#endif
在非ARC语ARC代码转换时,可以使用XCode的Convert Object_C ARC工具,-fno-objc-arc声明不支持ARC
arc -f-objc-arc声明支持ARC
所有权修饰符:
__strong:变量和属性都可以修饰,是默认修饰符,引用计数加1,持有保留对象
__unsafe_unretained:保留对象的引用,引用计数不加1,无持有对象时就会被释放,相当于非arc中的assign
_weak:与_unsafe_unretained效果相似,不过weak有归零,最后置为nil,_unsafe_unretained不为nil
_auto_releaing:用于返回一个自动释放变量 NSerror使用 ,最大的区别是不能声明属性
ARC会将未初始化的变量默认为空值,但是不会将标量的值置为零,如int a,b
自由桥接:在OC中使用标准C和Core foundation时是不会遵循ARC的,因此在使用C语言是需要进行桥接
__bridge:告诉ARC不要增加引用计数也不要更改所有权
__bridge_retained:转换c指针并且引用计数增加 使用过NSRETUENS_RETAINED 就需要这个修饰符
__bridge_transfer: 用于转换Core Foundation指针类型,并且引用计数增加
ARC注意事项:
1循环保留 主要发生在代理与控制器的相互强引用 ,解决之道就是声明代理为weak或者unsafe_unretained 标记为弱引用引用计数不增加,就不会形成循环引用而泄露
2 在Arc中会改变_block的语义 arc中_block引用会被保留而不复制意味着会发生循环保留 正确的处理时使用_weak或者_unsafe_unretained引用
__weak id safeSelf = self;
self.block = ^(nssring * returnedString){
safe.labelControl.text = returnedString;
}