iOS block代码块强引用问题
block代码块在iOS开发中经常见到,例如AFN数据请求就是block,值得注意的是在block中不恰当的操作代码,会导致资源不被释放,导致内存泄漏,例如下面的数据请求:
__weak typeof(self) weakSelf = self;
[SWHttpTool POST:setAvatarPath parameters:parameter success:^(id responseObject) {
[weakSelf.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
// 通知我的页面更改用户头像
[[NSNotificationCenter defaultCenter] postNotificationName:@"SWUserInfoUpLoadIcon" object:nil];
} failure:^(NSError *error) {
}];
在请求成功的代码块中调用了 [weakSelf.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]方法,注意用的是weakSelf而不是self,用弱指针去操作self,这样的话,就不会导致block强引用的问题。如果用的是self的话,就是在block中强指针引用控制器,控制器(self)又强引用block,这样的话会导致死循环引用,谁也不会被释放,当控制器POP掉的时候也不会被释放,因此导致内存泄漏,所以在使用block的时候,一定要注意强指针的使用。
如果要查看控制器释放被释放掉,可以重写dealloc方法,在方法中做一下测试就可以了。
- (void)dealloc{
NSLog(@"%s",__func__);
}
dealloc方法是在控制器被销毁的时候调用的,可以用来测试控制器是否被销毁。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了