美文网首页
iOS-掉进了block的坑

iOS-掉进了block的坑

作者: RayJiang97 | 来源:发表于2017-06-06 11:16 被阅读0次

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


    背景

    小弟我在自己写的工具类中经常用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的坑

          本文链接:https://www.haomeiwen.com/subject/ddgsfxtx.html