AV8D know, 在block中使用self經(jīng)常會造成循環(huán)引用,那我們該如何解決循環(huán)引用的問題呢?
通常的做法是用__weak關鍵字生成一個弱引用,然后在block中使用這個弱引用:
__weak typeof(self)? weakSelf =self;
self.demoBlock= ^{? [weakSelf.tableView reloadData];};
這個self造成循環(huán)引用大家都get了,可能大家會忽略,在block中直接使用類的私有成員變量也會造成循環(huán)引用:
例如ViewController中有一個block類型的成員屬性someBlock,另外一個是私有變量_children:
@interfaceViewController:UIViewController
{
NSMutableArray*_children;
}
@property(copy,nonatomic)void(^someBlock)();
其實在默認情況下,ViewController中的_children是使用__strong修飾的,例2就等價于下面的例3
// 例3
@interfaceViewController:UIViewController
{? ??
?__strong NSMutableArray *_children;
}
@property(copy,nonatomic)void(^someBlock)();
這個時候,在為someBlock賦值的時候,直接使用__children就會造成retain cycle:
// 例4
- (void)viewDidLoad
{
? [superviewDidLoad];
self.someBlock= ^{
? ? [_children addObject:@"Tom"];// 上面代碼就等價于下面一行// [self->_children addObject:@"Tom"];
};
}
要打破此循環(huán)引用,也要用到清單1中使用的方法,不同的是,必須在block內(nèi)使用__strong的self:
// 例5
- (void)viewDidLoad
{
? [superviewDidLoad];
? __weak typeof(self) wself =self;
self.someBlock= ^{
? ? __strong typeof(wself) sself = wself;
? ? [sself->_children addObject:@"Tom"];
? };
}
小伙伴們get了嗎,作為一個真正的iOS碼農(nóng),這個坑必須要理解的哦!