一、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 [invocation getReturnValue:&resultSet];getReturnValue: just copies the bytes of the return value into the given memory buffer, regardless of type. It doesn't know or care about memory management if the return type is a retainable object pointer type. Since resultSet is a __strong variable of object pointer type, ARC assumes that any value that has been put into the variable has been retained, and thus will release it when it goes out of scope. That is not true in this case, so it crashes. (Also, the array that you had resultSet originally point to will be leaked, since getReturnValue: overwrites that value without releasing it. Why you even made that variable point to an object in the first place is beyond me.)

The solution is that you must give a pointer to a non-retained type to getReturnValue:. Either:

NSArray * __unsafe_unretained tempResultSet;
[invocation getReturnValue:&tempResultSet];
NSArray *resultSet = tempResultSet;

or:

void *tempResultSet;
[invocation getReturnValue:&tempResultSet];
NSArray *resultSet = (__bridge NSArray *)tempResultSet;

http://stackoverflow.com/questions/22018272/nsinvocation-returns-value-but-makes-app-crash-with-exc-bad-access

二、MRC 自动转换为ARC是否会引起Crash

  有可能存在这样的情况,请见博客 《ARC下面的对象被释放的bug》

 

  

  

ARC 下面可能导致的内存问题的更多相关文章

  1. ARC下需要注意的内存管理

    ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu)    之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也 ...

  2. iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案

    在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...

  3. iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?

    1.前言      本来以为在改成ARC以后,不再需要考虑内存问题了,可是在实践中还是发现有一些内存问题需要注意,今天我不谈block的循环引用的问题,主要说说一些对象.数组不内存得不到释放的情况. ...

  4. 解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

    下面两种现象,用同一种方法解决 1.解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题 2.突然有一天首页访问图片很慢,至少隔20多秒所有图片才会出来.(解析:app使 ...

  5. SQL Server 内存泄露(memory leak)——游标导致的内存问题

    原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...

  6. 使用block的时候,导致的内存泄漏

    明确,只要在block里边用到我们自己的东西,成员变量,self之类的,我们都需要将其拿出来,把它做成弱指针以便之后进行释放. 在ZPShareViewController这个控制器中,由如下代码: ...

  7. 精华阅读第 13 期 |常见的八种导致 APP 内存泄漏的问题

    本期是移动开发精英俱乐部的第13期文章,都是以技术为主,所以这里就不过多的进行赘述了,我们直接看干货内容吧!本文系ITOM管理平台OneAPM整理. 实际项目中的MVVM(积木)模式–序章 导读:开篇 ...

  8. 在Activity中使用Thread导致的内存泄漏

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/issue-7/%E5%9C%A8Activity%E4%B8%AD%E4 ...

  9. Android引导页过多导致OOM内存泄漏

    摘要:前几天推广我们APP的时候,有些手机加载引导页的时候会闪退或崩溃,在Bugly显示是OOM异常.    然后Bugly上面显示的解决方案是: 该异常表示未能成功分配字节内存,通常是因为内存不足导 ...

随机推荐

  1. Django回忆录

    Django使用回忆: 1.安装django: pip install django==1.9 2.创建项目及应用: django-admin startproject web django-admi ...

  2. FileOutputStream flush()

    FileOutputStream 继承 OutputStream ,flush方法查看源码方法体为空,所以flush没起到清除缓存的作用 改用BufferedOutputStream再调用flush( ...

  3. Chapter 21_5 替换

    gsub函数的第三个参数不仅是一个字符串,还可以是一个函数或table. 如果是函数,gsub会在每次找到匹配时调用该函数.调用时的参数是捕获到的内容,该函数的返回值作为要替换的字符串. 如果是tab ...

  4. 基于React Native的58 APP开发实践

    React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势.再加上Native的优秀性能,让越来越多的公司 ...

  5. hadoop,yarn和vcpu资源配置

    Hadoop  YARN同时支持内存和CPU两种资源的调度(默认只支持内存,如果想进一步调度CPU,需要自己进行一些配置),本文将介绍YARN是如何对这些资源进行调度和隔离的. 在YARN中,资源管理 ...

  6. Tomcat下的work目录

    work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录,这也正是为什么它叫work目录而不是cache目录的原因. jsp,tomcat的工作原理是当浏览器访 ...

  7. 阿里云ECS-Nginx阿里云客户端IP日志记录

    #前端有SLB服务,记录客户端真实IP信息 log_format main 'realip:$http_x_forwarded_for slbip:$remote_addr-$remote_user ...

  8. informix数据迁移工具使用介绍

    一.dbschema  USAGE:     dbschema [-q] [-t tabname] [-s user] [-p user] [-r rolename] [-f procname]    ...

  9. sqlserver负载均衡

    http://www.cnblogs.com/gaizai/p/3644510.html

  10. python生产者消费者模型

    业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...