MLeaksFinder是一個很好的IOS內(nèi)存泄漏檢測工具,能夠自動地檢測UIViewController和UIView相關(guān)的對象,不過最近在團隊中使用的時候刀闷,有遇到一些問題让歼,總結(jié)如下
-
UITouch持有UIButton的問題
在issue上有討論
在stroyboard里面使用的問題
在button 的點擊事件或者UITableview 的點擊Cell的事件中調(diào)用self.navigationController popViewControllerAnimated:YES 時就報沒有釋放
現(xiàn)在框架內(nèi)的處理是這樣的
NSNumber *senderPtr = objc_getAssociatedObject([UIApplication sharedApplication], kLatestSenderKey);
if ([senderPtr isEqualToNumber:@((uintptr_t)self)])
return NO;
簡單來說就是看一下是不是跟UIApplication的相關(guān)方法打上交道了,如果是的話虑鼎,忽略該UI控件,不做內(nèi)存檢測(鴕鳥代碼嗎……
在我們的項目中,確實有遇到類似的場景炫彩,表現(xiàn)為UIButton沒有及時釋放匾七。跟系統(tǒng)版本和機型有關(guān),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];
表現(xiàn)為痢缎,當(dāng)文本框聚焦的時候,點返回按鈕世澜,報按鈕未釋放
解決的方式很簡單独旷,用合理的方式去寫代碼,就能繞過這個坑
_phoneTextField.delegate = self;
- (void)textFieldDidEndEditing:(UITextField *)textField
{
//注冊一個文本框失焦的事件
}
- 手勢類控件沒有釋放
表現(xiàn)為當(dāng)手勢完成寥裂,直接讓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,不做檢測(又是鴕鳥代碼…………
- 鍵盤沒有釋放
曾經(jīng)遇到了一個奇怪的類沒有釋放
View-ViewController stack: (
RealNameVC,
UIView,
UITableView,
UIKeyboardCandidateInlineFloatingView
)
UIKeyboardCandidateInlineFloatingView是個什么鬼低飒,沒見過哦许昨。表現(xiàn)是這樣的,在Tableview的一個cell上面褥赊,放了一個UITextField糕档,讓他聚焦,左上角點按鈕返回的時候就報鍵盤沒有釋放拌喉,手動讓UITextField失焦也沒有效果翼岁。
解決方法很簡單,請確保你的模擬器能彈出系統(tǒng)鍵盤司光,如果不能,按Command + K
即可悉患。切換了以后残家,記得要重新構(gòu)建工程!