本文转载至 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的内存管理机制,这样才能有效避免内存泄露。

最新文章

  1. java-JDBC配置驱动程序
  2. DEV皮肤颜色获取
  3. Android消息推送完美方案
  4. MySQL存储过程(一)
  5. CTE的使用
  6. Google Java 风格 阅读随笔
  7. JS里的CSS函数
  8. 【树状数组】Bzoj1878[SDOI2009] HH的项链
  9. 针对不同.NET版本的条件编译
  10. apply 和call 的区别,apply实用小技巧
  11. maven release版本不自动更新的原因
  12. mysql 存储过程中结尾分割符修改
  13. 基础知识 - Golang 中的格式化输入输出
  14. Bat脚本:通过端口号查找进程号
  15. oauth2.0实现sso单点登录的方式和相关代码
  16. UML实践
  17. Spring MVC中如何解决POST请求中文乱码问题,GET的又如何处理呢
  18. Python 谷歌翻译
  19. vsftpd 服务移植出现 500 oops : socket 解决
  20. NAT and Traversal NAT(TURN/STUN/ICE)

热门文章

  1. JAVA常见算法题(八)
  2. scrapy爬虫 函数间传值简易教程
  3. Python按行读取文件、写文件
  4. C++ 11 可变模板参数的两种展开方式
  5. 【转载】 json字符串与JSON对象
  6. Unity3d修炼之路:游戏开发中,3d数学知识的练习【1】(不断更新.......)
  7. mongo: 索引
  8. C#开发--FTP操作方法管理
  9. ASP.NET CORE RAZOR :向 Razor 页面应用添加模型
  10. JavaSE入门学习21:Java面向对象之接口(interface)(二)