檢測(cè)循環(huán)引用方法
- 引入開(kāi)源庫(kù)MLeaksFinder
- 在Dealloc中打log愤惰,判斷是否銷(xiāo)毀
- Instruments中Leaks查看內(nèi)存泄漏
循環(huán)引用
1.WKWebview 中JS和OC交互痢艺,引起循環(huán)引用
[self.wkWebview.configuration.userContentController addScriptMessageHandler:self name:@"wkWebview"];
這個(gè)代碼中。
self->wkWebview->configuration->userContentController->self
造成循環(huán)引用
需要在viewWillDisapper:中移除scriptMessage座韵。
[self.wkWebview.configuration.userContentController removeScriptMessageHandlerForName:@"wkWebview"];
2.Cell中包含按鈕等點(diǎn)擊事件险绘,用Block來(lái)實(shí)現(xiàn)這個(gè)回調(diào)
image
cell是UITableView的子視圖,每個(gè)子視圖都是被其父試圖的subviews(NSArray*)屬性所強(qiáng)引用誉碴,即:self->tableView->subviews->cell宦棺。而cell因?yàn)榛卣{(diào)強(qiáng)引用了Block內(nèi)部的對(duì)象,形成了循環(huán)引用鏈條黔帕。cell->Block->self代咸。解決的方式是使用弱引用來(lái)傳入Block。
在Cell的Block中不要用方法上的tableView成黄。這樣還是會(huì)造成循環(huán)引用呐芥,應(yīng)該使用self.tableView來(lái)實(shí)現(xiàn)。
3.在單例中不要傳入View奋岁,被強(qiáng)引用思瘟,不能釋放,造成內(nèi)存泄露
4.MLeaksFinderBug,系統(tǒng)控件內(nèi)存泄漏:UIImagePickerController闻伶、UIAlertController
- 第一種方法
NSObject+MemoryLeak類(lèi)別潮太,
方法+ (NSMutableSet *)classNamesWhitelist中添加白名單。
+ (NSMutableSet *)classNamesWhitelist {
static NSMutableSet *whitelist = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
whitelist = [NSMutableSet setWithObjects:
@"UIFieldEditor", // UIAlertControllerTextField
@"UINavigationBar",
@"_UIAlertControllerActionView",
@"_UIVisualEffectBackdropView",
nil];
// System's bug since iOS 10 and not fixed yet up to this ci.
NSString *systemVersion = [UIDevice currentDevice].systemVersion;
if ([systemVersion compare:@"10.0" options:NSNumericSearch] != NSOrderedAscending) {
[whitelist addObject:@"UISwitch"];
}
//UIImagePickerController加入白名單虾攻,不報(bào)內(nèi)存泄漏
if ([systemVersion compare:@"10.0" options:NSNumericSearch] != NSOrderedAscending) {
[whitelist addObject:@"UIImagePickerController"];
}
});
return whitelist;
}
- 第二種方法
可以添加相應(yīng)類(lèi)的類(lèi)別,添加白名單來(lái)忽略提示框
------------.h------------
#import <UIKit/UIKit.h>
@interface UIImagePickerController (MemoryLeak)
@end
------------.m------------
#import "UIImagePickerController+MemoryLeak.h"
#import "NSObject+MemoryLeak.h"
@implementation UIImagePickerController (MemoryLeak)
- (BOOL)willDealloc {
return NO;
}
@end