2018-10-12 iOS中block造成的循环引用
主要还是看self->block->self,会不会产生这样的环。
引自:关于Block内部要不要使用weakSelf的几种情况
1、block是控制器对象的一个属性,则在block内部使用self将会引起循环应用
typedefvoid(^TestBlock)();
@interface SecondViewController ()
@property (nonatomic, copy)TestBlock testBlock;
@end
self.testBlock = ^()
{
NSLog(@"%@",self.mapView);
};
self.testBlock();
2、把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露
self.testBlock = ^()
{
[weakSelf test];
};
-(void)test
{
NSLog(@"%@",self.mapView);
}
3、当block不是self的属性时,block内部使用self也不会造成内存泄露
TestBlock testBlock = ^()
{
NSLog(@"%@",self.mapView);
};
[self test:testBlock];
4、当使用方法有block作为参数使用时,block内部使用self也不会造成内存泄露
- (void)viewDidLoad {
[super viewDidLoad];
[self getData:^(NSString *str){
NSLog(@"%@----%@", self, str);
}];
[[self class] getData:^(NSString *str) {
NSLog(@"类方法--%@---%@", self, str);
}];
}
- (void)getData:(SuccessBlock)success{
if (success) {
success(@"success");
}
}
+ (void)getData:(SuccessBlock)success{
if (success) {
success(@"success");
}
}