使用MLeaksFinder时遇到的坑

作者: tom510230 | 来源:发表于2016-06-03 16:00 被阅读4357次

MLeaksFinder是一个很好的IOS内存泄漏检测工具,能够自动地检测UIViewControllerUIView相关的对象,不过最近在团队中使用的时候,有遇到一些问题,总结如下

NSNumber *senderPtr = objc_getAssociatedObject([UIApplication sharedApplication], kLatestSenderKey);
if ([senderPtr isEqualToNumber:@((uintptr_t)self)])
    return NO;

简单来说就是看一下是不是跟UIApplication的相关方法打上交道了,如果是的话,忽略该UI控件,不做内存检测(鸵鸟代码吗……
在我们的项目中,确实有遇到类似的场景,表现为UIButton没有及时释放。跟系统版本和机型有关,iPhone6全版本、iPhone5s/iPhone5低于ios9会有问题

  • UIApplication的方法使用不对
//点击返回按钮,将所有的文本框失焦
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
[self.navigationController popViewControllerAnimated:YES];

解决方法有两个,将button传入,框架将自动忽略

//点击返回按钮,将所有的文本框失焦
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:sender forEvent:nil];
[self.navigationController popViewControllerAnimated:YES];

或者,用更简洁的方式

//点击返回按钮,将所有的文本框失焦
[[UIApplication sharedApplication] resignFirstResponder];
[self.navigationController popViewControllerAnimated:YES];
  • 没有使用delegate
//注册一个文本框失焦的事件
[_phoneTextField addTarget:self action:@selector(editEnd:) forControlEvents:UIControlEventEditingDidEnd];

表现为,当文本框聚焦的时候,点返回按钮,报按钮未释放
解决的方式很简单,用合理的方式去写代码,就能绕过这个坑

_phoneTextField.delegate = self;
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    //注册一个文本框失焦的事件
}
  • 手势类控件没有释放
    表现为当手势完成,直接让vc进行popViewControllerAnimated的时候,报控件未释放,如果快速点击另外一个按钮的话,则不会报错。
    解决的方法是,在框架的UIView+MemoryLeak.m文件里面,加入下面的代码
extern const void *const kLatestSenderKey;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if(touches.allObjects.count == 1){
        UITouch *touch = [touches anyObject];
        objc_setAssociatedObject([UIApplication sharedApplication], kLatestSenderKey, @((uintptr_t)touch.view), OBJC_ASSOCIATION_RETAIN);
    }
}

上述代码的意思是,对于UITouch的最后一次持有的view,不做检测(又是鸵鸟代码…………

  • 键盘没有释放
    曾经遇到了一个奇怪的类没有释放
View-ViewController stack: (
    RealNameVC,
    UIView,
    UITableView,
    UIKeyboardCandidateInlineFloatingView
)

UIKeyboardCandidateInlineFloatingView是个什么鬼,没见过哦。表现是这样的,在Tableview的一个cell上面,放了一个UITextField,让他聚焦,左上角点按钮返回的时候就报键盘没有释放,手动让UITextField失焦也没有效果。
解决方法很简单,请确保你的模拟器能弹出系统键盘,如果不能,按Command + K即可。切换了以后,记得要重新构建工程!

留意箭头位置.png

相关文章

网友评论

  • fighter0501:你好 我发现只要我的view或者控制器里面有uitextfield 就会报内存泄漏 这个怎么破??
    fighter0501:@tom510230 好的 谢谢了
    cw_:https://github.com/Tencent/MLeaksFinder/issues/80 可以看看这个最后的回复,能解决你的问题。
    tom510230:@fighter0501 可以hard code去过滤
  • 龙伟17:感觉里面的问题还是蛮多的
  • 4b4d42e9a1bb:请问一下,在项目中导入这个MLeaksFider之后,没有打印出任何东西呢,是还有需要做什么别的操作吗,我已经设置好了Build Settings
    tom510230:@吴章平 加qq群482121244讨论
    4b4d42e9a1bb:@tom510230 但是我在用leak工具的时候发现了泄漏,但是leak不好用
    tom510230:@吴章平 没有泄漏的话就不会打印哦,现在MLeaksFinder已经更新到0.2.0版本了,不会有assert而改为用弹框提醒,可以用pod集成
  • 003ab1c0c6ec:难怪有个自定义Button老是莫名其妙提示泄露
    003ab1c0c6ec:@tom510230 赞
    tom510230:最近我要改一下这个问题
  • 折腾范儿_味精:tom哥威武 要不要@bang 哥
    tom510230:@唯敬 早就跟原作者讨论过了
  • 邦Ben:应该再把其他情况也顺便写下的嘛~

本文标题:使用MLeaksFinder时遇到的坑

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