__weak,__block ,循环引用大概说
2017-12-12 本文已影响4人
cyhai
在使用block的时候,处理不当容易出现循环引用问题,或者对象过前释放的一些问题。
__weak的使用情况,__weak typeof(self) weakSelf = self;
如果定义了block属性,那么这个block就是self持有对象。但是block属性里面引用到self,则会出现相互持有,出现循环引用。直接用self有警告提示。
typedef void(^proBlock)(NSString * str);
@property (nonatomic , copy) proBlock block01;
//需要解除循环引用
self.block01 = ^(NSString *str) {
NSLog(@"%@",weakSelf.selfStr);
};
__block的使用情况,__block相当于给一个外部变量去访问block内部的权限。
BlockFunVc * bfv = [BlockFunVc new];
__block NSString * blockStr = @"";
[bfv blockFunVcWithBlock:^(NSString *str) {
blockStr = str;
}];
如果我不使用__block,那么blockStr是无法访问block,也就无法拿到str。
不需要弱引用的情况。一般来说UIView动画中使用的Block是不需要使用__weak,不持有该函数,用也是不需要,应该说只要不是相互持有对象,就不需要会准确点。
//TODO:函数
//====testV函数
- (void)blockFun:(void (^)(NSString *))block
{
self.proBlock02 = block;
}
//=======本身函数
- (void)testFun01
{
NSLog(@"调用的第一个");
}
//调用函数无需使用弱引用,self并未持有blockFun
[testVc blockFun:^(NSString *str) {
self.selfStr = str;
NSLog(@"%@",self.selfStr);
[self testFun01];
}];
[UIView animateWithDuration:3 animations:^{
self.view.frame = CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
}];
但当在block里面使用weakSelf多次调用的时候,可能会出现过早释放掉。这时候应该使用__strong
__strong typeof(self) strongSelf = weakSelf;
[strongSelf testFun01];
[strongSelf testFun02];
});