美文网首页
block内部使用临时变量的正确修饰符

block内部使用临时变量的正确修饰符

作者: Mi欧阳 | 来源:发表于2019-03-28 16:05 被阅读0次

    其实答案就是在临时变量前加__block 关键字,这个与苹果官方推荐的一致。
    但搜一下关于 variable is not assignable missing block 这个问题的答案清一色都是用static 关键字,所以自己做了下实验。
    结果:
    使用block关键字,临时变量将在方法结束后自动释放。
    使用static关键字,临时变量变为静态变量,不会自动释放。

    使用block关键字:

    @interface ViewController ()
    
    @property (weak, nonatomic) NSDictionary *myDict;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        __block NSDictionary *tempDict;
        [ViewController testBlock:^(NSDictionary *dictBack) {
            tempDict = dictBack;
            NSLog(@"打印信息1:tempDict的值:%@",tempDict);
            self.myDict = tempDict;
            NSLog(@"打印信息2:myDict的值:%@",self.myDict);
        }];
        NSLog(@"打印信息3:myDict的值:%@",self.myDict);
    }
    
    +(void)testBlock:(void(^)(NSDictionary *dictBack))block{
        block(@{@"test":@"test1"});
    }
    
    -(IBAction)testAction:(id)sender{
        NSLog(@"打印信息4:myDict的值:%@",self.myDict);
    }
    
    

    打印结果

    2019-03-28 15:57:46.645422+0800 HYCMainTestDemo[84840:5450649] 打印信息1:tempDict的值:{
        test = test1;
    }
    2019-03-28 15:57:46.645557+0800 HYCMainTestDemo[84840:5450649] 打印信息2:myDict的值:{
        test = test1;
    }
    2019-03-28 15:57:46.645642+0800 HYCMainTestDemo[84840:5450649] 打印信息3:myDict的值:{
        test = test1;
    }
    2019-03-28 15:57:59.750079+0800 HYCMainTestDemo[84840:5450649] 打印信息4:myDict的值:(null)
    

    可以看出,在离开viewDidLoad这个方法的作用域后tempDict就被正确释放了

    使用static关键字:

    @interface ViewController ()
    
    @property (weak, nonatomic) NSDictionary *myDict;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //注意:这里的关键字为static
        static NSDictionary *tempDict;
        [ViewController testBlock:^(NSDictionary *dictBack) {
            tempDict = dictBack;
            self.myDict = tempDict;
        }];
        NSLog(@"打印信息1:myDict的值:%p",&(*self.myDict));
    }
    
    +(void)testBlock:(void(^)(NSDictionary *dictBack))block{
        block(@{@"test":@"test1"});
    }
    
    -(IBAction)testAction:(id)sender{
        NSLog(@"打印信息2:myDict的值:%p",&(*self.myDict));
    }
    

    打印结果

    2019-03-28 16:02:16.959183+0800 HYCMainTestDemo[84947:5474243] 打印信息1:myDict的值:0x600001c21fa0
    2019-03-28 16:02:16.959397+0800 HYCMainTestDemo[84947:5474243] 打印信息2:myDict的值:0x600001c21fa0
    

    可见,静态变量的值没有被正确回收

    总结:
    如果想在bolck中使用外部的临时变量,该临时变量使用__block关键字即可。

    相关文章

      网友评论

          本文标题:block内部使用临时变量的正确修饰符

          本文链接:https://www.haomeiwen.com/subject/qmaqbqtx.html