本文不是技术向的文章,仅记录小弟我在开发中遇到的各种坑...
背景
小弟我在自己写的工具类中经常用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;
就可以解决循环引用的问题
网友评论