这几天看了block,但是对于其中的一些问题还是非常的疑惑。
我们知道,之所以造成bolck循环引用是因为,self持有了block,block又强引用持有了self 。
但是为什么在block内部再次强引用就不会造成循环引用呢?
代码如下:
@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。而内部变量的生命周期在执行完block {} 括号后就要释放,不需要等到block释放。所以block执行完毕后self只有blcok的弱持有,所以不会造成循环引用。