本文转载至 http://blog.csdn.net/allison162004/article/details/38753219 

iOS提供了ARC功能,很大程度上简化了内存管理的代码。

但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。

下面列举两种内存泄露的情况。

1,循环参照

A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

这种问题常发生于把delegate声明为strong属性了。

例,

  1. @interface SampleViewController
  2. @property (nonatomic, strong) SampleClass *sampleClass;
  3. @end
  4. @interface SampleClass
  5. @property (nonatomic, strong) SampleViewController *delegate;
  6. @end

上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。

ARC通过记录指向某对象的指针数量来判断该对象是否应该被释放(0代表可以释放)。因而如果出现循环引用,就会出现内存泄露。如下图所示。

 取消3->2的引用   导致泄露。

ARC的解决办法也和简单,使用弱引用(weak reference)。弱引用的申明方式举例如下:
id __weak P;
@property (weak) NSVIew *V;
还是以上面的例子做对比,结果如下:

 弱引用不增加计数, 从而消除leak。

2,死循环

如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。

这种问题常发生于animation处理。

例,

比如,

  1. CATransition *transition = [CATransition animation];
  2. transition.duration = 0.5;
  3. tansition.repeatCount = HUGE_VALL;
  4. [self.view.layer addAnimation:transition forKey:"myAnimation"];

上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。

解决办法是,在ViewController关掉的时候,停止这个animation。

  1. -(void)viewWillDisappear:(BOOL)animated {
  2. [self.view.layer removeAllAnimations];
  3. }

内存泄露的情况当然不止以上两种。

即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。

iOS ARC也会有内存泄露的更多相关文章

  1. ARC模式下的内存泄露问题

    ARC模式下的内存泄露问题 iOS提供的ARC 功能很大程度上简化了编程,让内存管理变得越来越简单,但是ARC并不是说不会发生内存泄露,使用不当照样会发生. 以下列举两种内存泄露情况: 死循环造成的内 ...

  2. ios CGImageRelease 出现 EXC_BAD_ACCESS的错误 ios特定形状剪裁图片 内存泄露

    CGImageRef imgRef = [image CGImage]; 通过此种方式的得到的CGImageRef不能利用CGImageRelease释放,因为你不拥有它所以不用释放 在ios中特定形 ...

  3. 深度:ARC会导致的内存泄露

    iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下面列举两种内存泄露的情况. 1,循环参照 A有个属性参照B,B有个属性 ...

  4. 使用ARC也可能发生内存泄露

    1,循环参照 A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放. 这种问题常发生于把delegate声明为strong属性了. 例, @interface Samp ...

  5. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  6. iOS ARC编译器规则和内存管理规则

    iOS 开发当中,自动引用计数已经是标准的内存管理方案.除了一些老旧的项目或者库已经没有人使用手动来管理内存了吧. ARC无疑是把开发者从繁琐的保留/释放引用对象逻辑中解脱出来.但这并不是万事大吉了, ...

  7. ARC下的内存泄露

    iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下面列举两种ARC导致内存泄露的情况. 1,循环参照 A有个属性参照B, ...

  8. android内存泄露小谈

    在做android的时候,用的语言大部分情况下都是java.以前最开始做的是编译器开发, 大部分情况都是用c语言和x86与arm架构的汇编,后来接触到ios用的是OC.对比之下, 感觉还是java用起 ...

  9. iOS 之 ARC 的内存泄露

    循环引用导致内存泄露,如block容易内存泄露

随机推荐

  1. jquery 纯JS设置select下拉框,并默认选中第一个

    //html页面<select id="payWay" class="easyui-combobox" name="payWay" s ...

  2. Hive JDBC——深入浅出学Hive

    第一部分:搭建Hive JDBC开发环境 搭建:Steps •新建工程hiveTest •导入Hive依赖的包 •Hive  命令行启动Thrift服务 •hive --service hiveser ...

  3. 【Hadoop】HIVE 数据表 使用

    3 使用 3.1 数据导入 3.1.1 可以使用命令行导入,也可以直接上传到HDFS的特定目录 3.1.2 格式问题 3.1.2.1 缺失/不合法字段默认值为NULL 3.1.2.2 最好数据是格式化 ...

  4. oracle闪回flashback_transaction_query知识点

    查询更新记录: select t.start_timestamp, t.commit_timestamp, t.logon_user, t.operation, t.table_name, t.tab ...

  5. 速查笔记(Linux Shell编程<上>)

    转载自: http://www.cnblogs.com/stephen-liu74/archive/2011/11/01/2202027.html 零.shell中的内部变量: 1.    $?:   ...

  6. 解压缩报错tar: Error is not recoverable: exiting now

    [root@Gris-11140 FMIS2600bak]# tar -zxvf /home/oradata/FMIS2600DMP.tar.gzgzip: stdin: not in gzip fo ...

  7. 质量平台建设之Mock平台

    转载:http://blog.csdn.net/spark2008/article/details/51372913 基于目前系统越来越多,在项目开发过程中,减少各模块之间的开发依赖,另保证各个系统模 ...

  8. perl学习笔记一

    标量数据 标量:数字.字符.可以存储在标量变量中也可以从文件和设备中读取. 数字:所有数字内部格式相同——双精度浮点数. 浮点数直接量:程序员在程序中直接键入的数字. 整数直接量:6129804028 ...

  9. synchronized的功能拓展:重入锁(读书笔记)

     重入锁可以完全代替synchronized关键字.在JDK5.0的早期版本中,重入锁的性能远远好于synchronized,但是从JDK6.0开始.JDK在synchronized上做了大量的优化. ...

  10. [转载]LoadRunner如何处理AJAX异步请求

    最近在网上经常有人问“LoadRunner脚本回放成功,但数据没有写入数据库,这是什么原因”,记得以前的同事也遇到过相同的问题,再次将解决方法贴出来,希望能帮助大家. 相信大家在做测试的过程中,特别是 ...