這幾天看了block,但是對于其中的一些問題還是非常的疑惑。
我們知道,之所以造成bolck循環(huán)引用是因為,self持有了block,block又強引用持有了self 。
但是為什么在block內部再次強引用就不會造成循環(huán)引用呢?
代碼如下:
@interface zswViewController ()
@property(nonatomic,copy) void(^he)(void);
@property(nonatomic,assign)NSInteger num;
@end
@implementationzswViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
__weak typeof(self) weakSelf =self;
self.he= ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%ld", (long)strongSelf.num) ;
};
self.he();
}
這是因為,直接使用外部變量的block會默認根據外部是否是強引用,而決定內部是否強引用。
所以如果直接引用self,block就會強引用self。而此時block有被self持有。所以block的生命周期(不考慮其他類引用了blcok)必須要要等到self釋放時 block引用計數-1,才能釋放。
但是如果先weak以后,再在block里使用strong。block先弱持有self,然后block的內部變量持有self。而內部變量的生命周期在執(zhí)行完block {} 括號后就要釋放,不需要等到block釋放。所以block執(zhí)行完畢后self只有blcok的弱持有,所以不會造成循環(huán)引用。