浅谈iOS中的循环引用问题

关于iOS中循环引用的场景:

1、代理 delegate

     这个一般是不会出错的,ARC创建代理的时候我们用的是weak,MRC下我们用的assign。基本就避免了这个问题。


2、block

     把block创建某个类的成员属性时,self会对block产生一个强引用,block创建用的是copy,是因为block会对block内部的变量的值进行copy。这时候block会对block中的变量产生一个强引用。 如果block中有 self.xxxx 或者有属于self的成员但是没有self. 这样的话 就造成了block的循环引用问题。

     解决办法: 通过 __weak  __block 去声明一个弱引用的self 。

_weak typeof(self) weakSelf = self;

self.blkA = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;//加一下强引用,避免weakSelf被释放掉
NSLog(@"%@", strongSelf->_xxView); //不会导致循环引用.
};
    (代码为摘抄的)

3、NSTimer
   同样是当NStimer作为某个类的成员属性是会发生循环引用。设置为成员属性是有一个self对timer的强引用, 在实例timer的时候一般指定的target为:self。这样就造成了循环引用,
   解决办法:
     //停止定时器
    [self.myTimer invalidate];
    //销毁timer
    self.myTimer = nil;

注: NStimer停止后是不能再开启的,所以使用的时候 停止timer后设为nil。再在使用的地方创建一个nstimer就好。

鄙人愚见,如有不同的意见或者有问题的地方请评论,或者联系本人QQ:285160304

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值