iOS-掉进了block的坑

本文不是技术向的文章,仅记录小弟我在开发中遇到的各种坑...


背景

小弟我在自己写的工具类中经常用block传数据,而工具类没有持有block。
直接在block中用self去调方法,一直没出现循环引用的问题,直到我用了MJRefresh...

当时的代码是这样的

self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
    [self doSomething];
}];

在离开VC的时候发现dealloc没有被调用,就开始排查问题出在哪里。
傻傻地排查了半个多小时才想起来block会有循环引用问题...

将代码改成了这样就好了

__weak typeof(self) weakSelf = self;
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
    [weakSelf doSomething];
}];

使用UIAlertController也要注意循环引用的问题

下面这段代码会导致UIAlertController无法释放

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请输入充值金额" message:nil preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *yesAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    NSString *money = alert.textFields[0].text;
    ...
}];
UIAlertAction *noAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];

[alert addAction:yesAction];
[alert addAction:noAction];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    textField.keyboardType = UIKeyboardTypeNumberPad;
}];

[self presentViewController:alert animated:YES completion:nil];

当UIAlertController加上TextField的时候,要注意获取TextField的内容时需要用weakAlert去获取。

解决方法

在alert创建后声明weakAlert
__weak typeof(alert) weakAlert = alert;
将yesAction的block中的这段代码
NSString *money = alert.textFields[0].text;
改成
NSString *money = weakAlert.textFields[0].text;
就可以解决循环引用的问题

你可能感兴趣的:(iOS-掉进了block的坑)