ARC 下面可能导致的内存问题
一、ARC相对MRC来说,减轻了程序员的大部分内存管理工作,使用ARC的时候也需要十分清除内存管理的原理,不然可能带来一些很难调试的问题。下面是ARC下面需要注意的一些问题
1)对象互相引用,形成引用循环。引用循环是基于引用计数无法避免的问题,因为Objetive-C实质上还是一种编译时期的内存管理技术,没有引入GC,所以引用循环问题还是需要程序员手工处理。
具体的处理办法就是使用weak,assign,_unsafe_unretained 修饰变量,打破引用循环。
对象引用循环可能导致的问题,对象持久不释放,比如内存中存在两个VC,收到通知时,同一个方法执行两次等诡异的现象(大部分人通知的移除放在dealloc里面,放在viewWillAppear中可以避免此问题,但也可能引入更多问题)。
2)使用ARC的时候,小心处理assign修饰的对象,assign只是简单的赋值,不对对象的引用计数做改变,对象释放了,这个assign记录的对象地址还是不变。向这个对象发送消息的时候,会偶先Crash。
如果这个对象释放之后,对象内存区域数据,还是没有变化,是不会crash的。
这一类crash是偶先的,有可能crash极难重现,想要暴漏这些问题,尽量不要使用assign、_unsafe_unretained ,而使用weak。
有时候assign、_unsafe_unretained是无法避免的,例如NSNotification的observer,KVO的observer,NSValue valueWithNonretainedObject;
还有可能是因为历史遗留代码中使用到assign、_unsafe_unretained。
3)多线程传递autoRelease对象可能引起Crash
autorelease的对象使用一种延迟释放的技术,将对象暂时记录下来,当autorelease pool drain的时候,向对象发送release消息。
autorelease跟runloop存在一定的联系,runloop的每一次循环中,会默认创建一个autoreleasepool,因此如果在一个线程中,没有创建runloop并且没有创建autoreleasepool,autorelease对象可能存在泄漏。
跨线程传递一个autorelease对象的时候,有可能对象在原来的线程中被提前释放掉。
例如下面的代码:
由于参数没有retain,有可能autorelease参数会被提前释放
- (id) method
{
NSInvocation *invocation = [nsinvocation alloc] initWith ...
//参数是autorelease的
[invocation setArg:&[nsdata data] atIndex:index]
//延迟调用
invocation performselector:@selector(invoke) afterdelay:
}
这里还有一个ARC下面的例子:
|
23down voteaccepted
|
I am guessing you are using ARC? The problem is with the line The solution is that you must give a pointer to a non-retained type to
or:
|
http://stackoverflow.com/questions/22018272/nsinvocation-returns-value-but-makes-app-crash-with-exc-bad-access
二、MRC 自动转换为ARC是否会引起Crash
有可能存在这样的情况,请见博客 《ARC下面的对象被释放的bug》
ARC 下面可能导致的内存问题的更多相关文章
- ARC下需要注意的内存管理
ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu) 之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也 ...
- iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案
在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...
- iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?
1.前言 本来以为在改成ARC以后,不再需要考虑内存问题了,可是在实践中还是发现有一些内存问题需要注意,今天我不谈block的循环引用的问题,主要说说一些对象.数组不内存得不到释放的情况. ...
- 解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题
下面两种现象,用同一种方法解决 1.解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题 2.突然有一天首页访问图片很慢,至少隔20多秒所有图片才会出来.(解析:app使 ...
- SQL Server 内存泄露(memory leak)——游标导致的内存问题
原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...
- 使用block的时候,导致的内存泄漏
明确,只要在block里边用到我们自己的东西,成员变量,self之类的,我们都需要将其拿出来,把它做成弱指针以便之后进行释放. 在ZPShareViewController这个控制器中,由如下代码: ...
- 精华阅读第 13 期 |常见的八种导致 APP 内存泄漏的问题
本期是移动开发精英俱乐部的第13期文章,都是以技术为主,所以这里就不过多的进行赘述了,我们直接看干货内容吧!本文系ITOM管理平台OneAPM整理. 实际项目中的MVVM(积木)模式–序章 导读:开篇 ...
- 在Activity中使用Thread导致的内存泄漏
https://github.com/bboyfeiyu/android-tech-frontier/tree/master/issue-7/%E5%9C%A8Activity%E4%B8%AD%E4 ...
- Android引导页过多导致OOM内存泄漏
摘要:前几天推广我们APP的时候,有些手机加载引导页的时候会闪退或崩溃,在Bugly显示是OOM异常. 然后Bugly上面显示的解决方案是: 该异常表示未能成功分配字节内存,通常是因为内存不足导 ...
随机推荐
- 实战ASP.NET访问共享文件夹(含详细操作步骤)
博客园找找看(http://zzk.cnblogs.com)的索引文件占用空间太大,需要移至另外一台服务器,所以要解决"在ASP.NET中通过共享文件夹访问索引文件"的问题. 假设 ...
- package scripts在前端项目的使用
前端的项目往往依赖了很多打包.部署工具,比如grunt,gulp,webpack.....,在这么多打包.部署工具里,有这各自的命令,这样给项目带来了很多烦恼,不同的项目不同的命令,有没有办法统一接口 ...
- 安装VMWare WorkStation 10 异常【 Failed to create the requested registry keyKey:Installer Error: 1021】
下载了新的workstation 10,在安装的时候出现了异常Failed to create the requested registry keyKey:Installer Error: 1021. ...
- 兼容不同浏览器的 CSS Hack 写法
所谓 CSS Hack,是指在 CSS 代码中嵌入诸如 *,*html 等代码,方便于独立控制某种浏览器的具体样式.比如有些 CSS Hack 只能被 IE6 或 IE7 识别,而 Firefox ...
- 多线程随笔一(AutoResetEvent和ManulResetEvent)
AutoResetEvent和ManulResetEvent是.net中用来做线程的同步的两个类.从类名上不难看出,这两个类的区别在于一个是自动的,一个是手动的(这不是废话嘛).两个类的实现原理大致相 ...
- MAMP、wordpress安装
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Helvetica } p.p4 { margin: ...
- Centos6.5环境中安装vsftp服务
1.检查vsftp是否安装 命令:rpm -qa|grep vsftpd 若已经安装,则显示相关的版本信息,否则什么也没有. 也可以输入find -name "vsftpd" -p ...
- ® 不需要显示为商标符的做法
若url中有参数reg,则把® 变为 ®
- 在CDlinux下编译安装无线网卡驱动
环境 主机:ThinkPadT440P 系统:CDlinux9.7.1 概述 准备利用CDlinux来破解周围的wifi密码来免费蹭网,由于笔记本是新买的,系统没有自带驱动,只能自己手动到网上下载.编 ...
- Redis字符串类型相关操作命令
string是redis最基本的类型,可以包括任何类型数据,如jpg图片或者序列化对象. 单个value最大上限是1G字节 如果只使用string类型,redis就可以被看做具有持久化特性的memca ...