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

2019-03-28  本文已影响0人  Mi欧阳

其实答案就是在临时变量前加__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关键字即可。

上一篇下一篇

猜你喜欢

热点阅读