ARC 下的内存泄露

来源:互联网 发布:炒股神经病 知乎 编辑:程序博客网 时间:2024/06/05 10:21

NSNotificationcenter

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(method:) name:@"notiName" object:nil];

这里添加观察者其实是不会造成内存泄漏的,但是,但是,但是……如果self被销毁,当在调用post消息的时候,就会报对象被释放的错误,导致闪退,所以在添加观察者的对象,一定要在它被销毁的时候从消息中心删除!

就是在注册通知的地方加上这个:

- (void)dealloc {    [[NSNotificationCenter defaultCenter]removeObserver:self];}

NSTimer

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(method:) userInfo:nil repeats:YES]; 

上面的timer为了防止 target 被释放而导致的程序异常,timer 会持有 target, self 持有 timer,timer 在初始化时持有 self,造成循环引用。解决的方法就是使用 invalidate 方法销掉 timer。

delegate属性的强引用

delegate声明为strong属性容易导致内存溢出 。

解决办法是把delegate属性的strong改为assign即可。

WKWebView

[_webView.configuration.userContentController addScriptMessageHandler:self name:clickName];

添加addScriptMessageHandler之后,必须在vc销毁前把它移除。

[_webView.configuration.userContentController removeScriptMessageHandlerForName:clickName]; 

NSNotification 很类似。

Block

这里写图片描述

上面图片中就是一典型案例,红色部分就是修改之前导致内存溢出的代码,我们来分析一下:

上面的success block应该是self持有,而在success中有持有了self,导致self和 block 的循环引用,造成内存泄露!

说到底还是造成了循环引用导致了内存泄漏,所以我们要打破循环,释放对象,这里我们把self变成了弱引用,打破循环引用。

以上几种情况可能通过instrument 是查看不出来的,至少是没有小红叉的。我们通过instruments查看所有VC的引用计数才找到那些VC是发生了内存泄露。

参考他的

0 0
原创粉丝点击