ARC 内存管理见解

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;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值