处理block中调用对象实例变量导致的循环引用


id="iframeu1788635_0" src="http://pos.baidu.com/qcmm?rdid=1788635&dc=2&exps=112004&di=u1788635&dri=0&dis=0&dai=2&ps=236x797&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1473752217517&ti=%E5%A4%84%E7%90%86block%E4%B8%AD%E8%B0%83%E7%94%A8%E5%AF%B9%E8%B1%A1%E5%AE%9E%E4%BE%8B%E5%8F%98%E9%87%8F%E5%AF%BC%E8%87%B4%E7%9A%84%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8%20%7C%20%E5%AD%A6%E6%AD%A5%E5%9B%AD&ari=2&dbv=0&drs=1&pcs=1143x822&pss=1143x256&cfv=22&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1473723417&rw=822&ltu=http%3A%2F%2Fwww.xuebuyuan.com%2F2067323.html&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DKchERxMaR02zwhDPy3MLcHjxPdGJWiFkjQdYv1WKGJjbP2D3LwYl7hIvnKE9nBeI%26wd%3D%26eqid%3Ddcf0305c0001b8220000000457d7ac53&ecd=1&psr=1920x1080&par=1920x977&pis=-1x-1&ccd=24&cja=true&cmi=8&col=zh-cn&cdo=-1&tcn=1473752218&qn=95ac3c87ff7b9df4&tt=1473752217497.39.248.248" width="336" height="280" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; background-color: transparent; vertical-align: bottom;">

      在传入block的类的dealloc方法中加断点后,dealloc方法没有被调用,确认如果在block中直接引用对象的实例变量也会引起循环引用。比较常规的解决办法就是用weak self + property的方式解决。但是个人一直觉得属性是用来向外公开的,类内部用的变量不应该用属性的方式实现。所以折腾了半天,有了以下的解决方案:

@interface TestVC (){
    BOOL _isToOuter;
}
@end

@implementation TestVC
-(void)test{
NeedABlockObj* obj=[[NeedABlockObj alloc] init];
        
        __typeof (&*self) __weak weakSelf = self;
        obj.aBlock = ^(int to){
  //不把weak 转为strong,则无法编译通过。
            __typeof (&*self)  strongSelf = weakSelf;
            
            strongSelf->_isToOuter = YES;
        };
}
@end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值