block代码块对变量的处理的一些看法

1,先给大家推荐一篇博文,关于arc下使用代码块避免循环的,对我的帮助比较大,原文地址:http://www.cnbluebox.com/?p=255%3C/p%3E

2,我总结一下我对于使用代码块时block对相应变量的一些处理:(有可能出现错误,希望大家指正)

    在非arc环境下,先来看普通变量的变化,如下代码:

    UILabel * __block label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
    NSLog(@"label_RetainCount:%d",[label retainCount]);
    self.block =  [^(void){
        label.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
           NSLog(@"label_RetainCount:%d",[label retainCount]);
        } copy];
    self.block();
     第一次输出的引用计数是1,第二次输出的是2(代码块中的),说明代码块将变量进行的retain操作,然后将普通变量加上__block 修饰符

    UILabel * __block label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
    NSLog(@"label_RetainCount:%d",[label retainCount]);
    self.block =  [^(void){
        label.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
           NSLog(@"label_RetainCount:%d",[label retainCount]);
        } copy];
    self.block();
      两次输出的都是1,说明了代码块对于label没有进行任何处理,就单单传递了它的指针给代码块

     

     在arc环境下,对于普通变量(__strong修饰符),block会对它进行强引用,所以容易产生block循环。解决的方法是使用__weak修饰符,假如除了不进行强引用还需要修改变量值的话可以增加一个__block修饰符,比如__block id __weak obj;




    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值