block 循环引用

结论:block作为成员变量,内部引用self的成员变量,必须使用self 弱引用
block作为局部变量,无论怎样写,都不会对self造成强引用
Block为变量

(1)block为成员变量

    typedef NSString*(^BlockCC)(void);

    @interface TwoViewController ()
    {
        BlockCC _block;
        NSString *_string;
    }
    @end

    -(void)buttonAction:(UIButton *)button
    {
        _string  = @"2";
        _block = ^{
            NSLog(@"string:%@",self->_string);
            return @"2";
        };
        NSString *a = _block();
        [self dismissViewControllerAnimated:YES completion:^{

        }];
    }

    -(void)dealloc
    {
        NSLog(@"TwoViewController dealloc");
    }
测试结果:dealloc 方法没有调用  上面例子直接引用self 

block作为成员变量 ,block实现函数内调用成员变量,也会间接强引用self
    -(void)buttonAction:(UIButton *)button
    {
        _string  = @"2";
        _block = ^{
            NSString *m = _string;
            return @"2";
        };
        NSString *a = _block();
        [self dismissViewControllerAnimated:YES completion:^{

        }];
    }
测试结果:dealloc 方法没有调用,block还是间接强引用self,造成循环引用
  • 问题发散
-(void)buttonAction:(UIButton *)button
{
    _string  = @"2";
    __weak TwoViewController *weakself = self;
    _block = ^{
        NSLog(@"block excute");
        [weakself test];
        return @"2";
    };
    NSLog(@"嘎嘎");
    NSString *a = _block();
    [self dismissViewControllerAnimated:YES completion:^{
    }];
}

-(void)test
 {
     NSLog(@"test function excute:%@",self);
 }

以上代码中,block函数中使用weakself 调用的函数中使用了self,会不会造成循环引用?
测试结果:

2016-04-21 17:53:15.364 BlockMemoryTest[6144:209239] 嘎嘎
2016-04-21 17:53:15.365 BlockMemoryTest[6144:209239] block excute
2016-04-21 17:53:15.365 BlockMemoryTest[6144:209239] test function excute:<TwoViewController: 0x7fa019f1a6c0>
2016-04-21 17:53:15.868 BlockMemoryTest[6144:209239] TwoViewController dealloc

答案:不会
(2)block作为局部变量调用

-(void)buttonAction:(UIButton *)button
{
    _string  = @"2";
    BlockCC blockcc;
    blockcc = ^{
        NSString *m = self.string;
        return m;
    };
    NSString *a = blockcc();
    [self dismissViewControllerAnimated:YES completion:^{

    }];
}
测试结果:dealloc方法调用  局部变量的block不会造成循环应用(猜测内部原因可能self 没有强引用block)

参考文章:

http://www.cocoachina.com/ios/20120514/4247.html
http://www.cnblogs.com/tangbinblog/archive/2012/12/31/2840690.html
http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值