ios 在开发中常会遇到在block中用到self, 通常声明一个__weak typeof(self)weakSelf = self, 就可以解决循环引的问题,用到属性就这样: weakSelf.property , 但是直接调用成员变量(or 实例变量 whatever)_property (或是其他手动声明的)会怎么样?答案是block也会对self进行强引用导致循环引用, 在下就遇到了。我是在控制器类的扩展里声明了几个成员变量,然后在block里直接用了, 发现控制器怎么都不释放, 最后google了半天, 在苹果官方文档里找到了答案:这里是传输门。
解决方案有很多:1、把成员变量改成属性,通过weakSelf调;2、(也是苹果文档里说的)声明一个局部变量接一下,在block里用这个局部变量;3、 应该还有其他办法,还没发现。
下面示例代码, 别当真!
@interface AccountSetingController ()
{
NSString *_about; //声明
}
问题代码:
__weak typeof(self)weakSelf = self;
item.cellSelectBlock = ^(NSIndexPath *path){
ProtocolHTMLController *htmlVC = [[ProtocolHTMLController alloc]init];
htmlVC.requesURL = _about; //使用
[weakSelf.navigationController pushViewController:htmlVC animated:YES];
};
正确代码:
__weak typeof(self)weakSelf = self;
NSString *local_about = _about;
item.cellSelectBlock = ^(NSIndexPath *path){
ProtocolHTMLController *htmlVC = [[ProtocolHTMLController alloc]init];
htmlVC.requesURL = local_about; // 使用
[weakSelf.navigationController pushViewController:htmlVC animated:YES];
};
* 苹果官方文档的解释是 如果通过引用来访问成员变量,那么就会对self强引用,如果通过值访问成员变量,那么就会对这个值强引用。