结论: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