iOS block代码块强引用问题

来源:互联网 发布:独立游戏开发者 知乎 编辑:程序博客网 时间:2024/06/06 00:38

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方法是在控制器被销毁的时候调用的,可以用来测试控制器是否被销毁。

1 0
原创粉丝点击