iOS中block循环引用问题
1、block是控制器对象的一个属性,则在block内部使用self将会引起循环应用
typedef void(^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"); } }
如需转载,请注明出处