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

你可能感兴趣的:(Xcode-小知识点)