问题: 我昨天发现我的导航控制器在pop的时候居然没有走dealloc方法,我在leaks里面去运行,也没有发现内存泄漏的提示。
归根结底,是因为当前控制器被某个对象强引用在控制器pop的时候count没有减为0,导致控制器的引用计数不为0,系统无法帮你释放这部分内存。
总结了一下控制器被强引用不走dealloc的原因无非就是三种常见情况:
一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码,对视图控制器的强引用。
二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
三.控制器中的代理属性一定要是弱引用,不要强引用。
而我遇到的恰好不是这3种情况:而是下面这一种,第4种
UIAlertController的循环引用问题
- 在使用时有一个特别容易被忽视的地方就是在 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];
}
网友评论