本文转载至 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. Spring: aop自动标注时出现 “0 formal unbound in pointcut"

    异常代码信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name forma ...

  2. python 实现创建文件夹和创建日志文件

    一.实现创建文件夹和日志 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: nulige import os import datetime ...

  3. 获得Oracle当前日期的年或月的第一天和最后一天

    .当前日期的年份第一天和最后一天 第一天 select trunc(sysdate,'y') FROM DUAL; select trunc(sysdate,'yy') FROM DUAL; sele ...

  4. Nginx include和Nginx指令的使用

    Nginx include和Nginx指令的使用 1.nginx include 主配置文件nginx.conf中指定包含其他扩展配置文件,从而简化nginx主配置文件,实现多个站点功能 [root@ ...

  5. 修改PHP上传文件的大小限制(post)

    在PHP的默认配置情况下,当上传的文件大小超出一定的限制时,我们将得到如下的错误提示信息: Warning: POST Content-Length of 625523488 bytes exceed ...

  6. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_指针

    定义pt为指向INT类型的指针,在程序中取得var_int1的地址(INT类型),然后将地址对应的数据还原给var_int2(pt^的写法)     更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...

  7. autoRelease

    cocos2dx采用的是引用计数的方式来管理对象的持有和释放. 所谓引用计数就是说,每个对象都会有一个属性用来记录当前被几个地方引用了.在释放内存的时候会根据这个引用计数来确定是否要用delete操作 ...

  8. 使用C++11的function/bind组件封装Thread以及回调函数的使用

    之前在http://www.cnblogs.com/inevermore/p/4008572.html中采用面向对象的方式,封装了Posix的线程,那里采用的是虚函数+继承的方式,用户通过重写Thre ...

  9. Win8.1应用开发之Bing Maps

    这里介绍怎样进行Bing Maps的开发.首先我们须要在我们的程序中引入Bing Map的SDK.详细方法,这里推荐一个链接<win8>使用Bing地图.这样一个hello world便出 ...

  10. LeetCode题目:Best Time to Buy and Sell Stock

    原题地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ 解决方法:动态规划,minimun存储的是当前价格中最小的. c ...