不调用dealloc方法

问题: 我昨天发现我的导航控制器在pop的时候居然没有走dealloc方法,我在leaks里面去运行,也没有发现内存泄漏的提示。

归根结底,是因为当前控制器被某个对象强引用在控制器pop的时候count没有减为0,导致控制器的引用计数不为0,系统无法帮你释放这部分内存。

总结了一下控制器被强引用不走dealloc的原因无非就是三种常见情况:

一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码,对视图控制器的强引用。

二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。

三.控制器中的代理属性一定要是弱引用,不要强引用。

而我遇到的恰好不是这3种情况:而是下面这一种,第4种

UIAlertController的循环引用问题

  1. 在使用时有一个特别容易被忽视的地方就是在 handle事件中使用了 UIAlertController控制器。这里会造成循环引用,在堆内存中残留大量的无用对象无法被销毁。
    引起的原因
    a.创建的UIAlertAction会被UIAlertController的一个actions属性引用。
    b.在UIAlertAction中他的handler代码块 会引用UIAlertController对象(如果是直接使用UIAlertController对象)。
    c.actions属性又被UIAlertController对象引用。

解决办法
__weak typeof (alertController) weakAlertController = alertController;

  __weak typeof (self) weakSelf = self;
        UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"就餐人数" message:nil preferredStyle:UIAlertControllerStyleAlert];
        [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
            textField.placeholder = @"请输入人数";
            textField.keyboardType = UIKeyboardTypeNumberPad;
            textField.delegate = weakSelf;
        }];
        __weak typeof (alertController) weakAlertController = alertController;
        UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
        UIAlertAction * sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            
            UITextField * tf = weakAlertController.textFields.lastObject;
            cell.detailTextLabel.text = tf.text;
            pepoleCountString = cell.detailTextLabel.text;
             [table reloadData];
           
        }];
        [alertController addAction:cancelAction];
        [alertController addAction:sureAction];
        [self presentViewController:alertController animated:YES completion:nil];
        
    }

你可能感兴趣的:(不调用dealloc方法)