美文网首页
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的坑

    本文不是技术向的文章,仅记录小弟我在开发中遇到的各种坑... 背景 小弟我在自己写的工具类中经常用block传数据...

  • iOS-关于Block,你不得不知

    iOS-关于Block,你不得不知

  • iOS-Block源码分析

    前言 iOS-深入研究Block[https://www.jianshu.com/p/2e32807718a8]这...

  • iOS-Block02-小谈block的底层数据结构

    在写这篇文章的时候,距离上一篇写block的文章已经过了很久了iOS- 谈谈自己知道的block(菜鸟的总结)。笔...

  • iOS-Block 中 为何使用 weakSelf 和 stro

    目录 本篇幅代码会有些多,需要读者耐心看完。 一 block 循环引用讲解 详细请移步至 iOS-底层原理(11)...

  • Block返回nil报错

    解决一个使用Block遇到的坑 报错 *Incompatible block pointer types init...

  • iOS进阶-深度学习block原理

    目录 基本声明使用总结 block在ARC、MRC下内存方式 使用block遇到的坑 更深次的看block的本质 ...

  • ios-面试-block

    block本质上也是一个OC对象,它内部也有个isa指针block是封装了函数调用以及函数调用环境的OC对象blo...

  • 掉坑

    发现问题,掉进坑里,慢慢爬出来,下次再遇到这个事情还是继续往坑里跳,不嫌累啊。啥时候是个头啊?老是扮演受害者,...

  • 掉坑

    有娃的妈,且怒且乐着。晚上宝丫头让为娘的给冲奶,为娘让她试试能不能啃到自己的小脚丫,啃到了就给她冲奶,她随便试了一...

网友评论

      本文标题:iOS-掉进了block的坑

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