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
- ARC 下的内存泄露
- ARC 下内存泄露的那些点
- ARC 下内存泄露的那些点
- ARC 下内存泄露的那些点
- ARC 下内存泄露的那些点
- ARC下可能的内存泄露
- ARC下内存泄露问题
- ARC下内存泄露总结
- ARC下内存泄露问题
- iOS开发 ARC下造成内存泄露的问题
- ARC下导致内存泄露的几种情况
- iOS ARC下内存泄露 注意点
- IOS ARC下内存泄露总结
- arc依然内存泄露??!?!?!?!?!??
- ARC-分析内存泄露
- ARC中的内存泄露
- iOS ARC下内存泄露的几种情况和解决办法
- ARC下NSException有可能会引起内存泄露
- eazyui小窗口展示
- HTML5 移动Web App阅读器-4(页面基本结构开发)
- poj 1731 Orders(库函数运用)
- 关于js 点击所在行,获取隐藏域问题
- linux内核进程退出分析
- ARC 下的内存泄露
- 修改配置参数后无法启程MySQL数据库
- 博文要有的元素
- iOS 开发之 pdf 文档的加载与浏览的 4 种方式
- extjs4.2导出excel表格
- Java Expression Language (JEXL)
- redis 数据类型详解 以及 redis适用场景场合
- Android线程及进程笔记
- chrome打不开plugins