AV8D know, 在block中使用self经常会造成循环引用,那我们该如何解决循环引用的问题呢?
通常的做法是用__weak关键字生成一个弱引用,然后在block中使用这个弱引用:
__weak typeof(self) weakSelf =self;
self.demoBlock= ^{ [weakSelf.tableView reloadData];};
这个self造成循环引用大家都get了,可能大家会忽略,在block中直接使用类的私有成员变量也会造成循环引用:
例如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"];
};
}
要打破此循环引用,也要用到清单1中使用的方法,不同的是,必须在block内使用__strong的self:
// 例5
- (void)viewDidLoad
{
[superviewDidLoad];
__weak typeof(self) wself =self;
self.someBlock= ^{
__strong typeof(wself) sself = wself;
[sself->_children addObject:@"Tom"];
};
}
小伙伴们get了吗,作为一个真正的iOS码农,这个坑必须要理解的哦!