内存泄露之自动内存管理(ARC)
2015-12-29 23:56
253 查看
一.单个对象的内存管理
在Xcode5.0之前都是手动内存管理的,但是在5.0之后就不需要程序猿管理了,为什么呢?因为Xcode会自动在我们需要释放的地方加上release,这也是Xcode的一项功能吧.这样就能免去了我们对代码的花太多的时间关心内存释放的问题了,我们就可以专心的提高代码实现某一项功能了.在ARC模式下,系统的内存到底是怎么管理的呢?在ARC的机制下,只要对象没有被强指针(strong)指向的话,就会释放.这就是ARC模式下内存释放的主要特性.那么我们先来看看单个内存的管理吧.
方法的实现:
主函数:
结果显示:
为什么在ARC模式下,还是能在对象销毁的时候调用delloc方法呢?那对象又是怎么销毁的呢?是这样的:delloc在ARC模式下在对象销毁的时候也是能够执行的,只是并不能调用[super delloc]方法,所以delloc还是执行了.第二个问题就是由于自动释放池(@autoreleasepool)的效果,所以当对象出了自动释放池的范围,那么对象就会释放,也就是说释放的时候调用了delloc.具体的图我将为大家画出来.
为什么上面标明的是强指针呢?由于只要没有其它修饰符修饰,只要对象创建出来,默认就是被强指针指向.释放原因是:由于对象只要出了@autoreleasepool的范围,那么对象就会被销毁,也就是(*car)先销毁,对象在没有强指针指向的情况下,也就销毁了.所以这是单个对象在ARC模式下的内存管理.
二.多个对象的内存管理
当一个对象中存在另外一个对象的属性,也就是说用一个最简单的例子说明下,就是你有一条狗,而狗也拥有一个主人,那么就会存在多个指针之间的指向关系.我们先来看代码吧.上面两段代码就是在强指针下的代码.
由于是强指针指向的原因,delloc并不会调用,也就是说对象并没有释放.我们来看图:
看上面的图片可以知道,由于dog指针和person指针在对象创建出来的时候是强指针指向Dog和Person对象,那么什么时候释放呢?在对象出了@autoreleasepool的范围的时候dog和person指针就释放了,但是由于Dog对象和PPerson对象分别有strong指针互相指向,那么这里就出问题了,就造成Dog和Person对象无法释放了,也就是不能调用delloc方法了.那么怎么才能达到释放的效果呢?我们先从代码入手,然后再分析系统框图.
图一:
图二:
只要将Person或者Dog中的strong改为weak就好,但是这里不推荐两个都改为weak,因为如果是这样的话,指针太弱了,不安全.最好是strong和weak连用.下面是改完之后的结果.
上面所说的方法也能改善循环引用问题.这就是在ARC模式下的内存泄露以及管理的问题和方法,如果有什么issue,请给我留言,我们一起交流.谢谢!!!!!
相关文章推荐
- 图片合集
- 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了
- 【代码笔记】XML深入学习:DTD约束与DTD语法(2)
- MACTALK随谈
- Linux环境下MySQL基础命令(2)----查看、创建、删除库和表
- python之编写购物车(第二天)
- C++接口类的函数为什么等于0 ,如 classA()=0;
- 2. PHP-FIG
- 太上感应篇0009
- HDU5600
- vba_WriteToTextFile_ADO
- 喝酒不骑马的Android自学日记(11)-Viewpager
- android如何解析网络上的json数据。
- Python之禅+八荣八耻
- 计算机中堆栈的概念
- C# 多线程,论多核时代爱恨情仇
- DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间
- ucosii系统初始化函数
- 2015年度个人总结和计划
- vc 使用了SerialPort类的串口通信软件分析