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关键字即可。