内存泄露之手动内存管理(MRC)
来源:互联网 发布:特朗普减税 知乎 编辑:程序博客网 时间:2024/06/05 03:40
一.单个对象内存管理
由于移动设备的内存是有限的,如果创建的对象用完不及时的销毁(释放)的话,就会造成内存泄露.如果该对象的内存空间释放了,但是依旧在使用的话,那么就是僵尸对象.同时指向僵尸对象的指针就是野指针.对于内存管理的原则是,不用的对象就要回收其所占用的空间,防止造成内存泄露.并且我们要知道,内存泄露主要是针对堆区的对象.其它的区域并不存在内存的泄露.
下面我将为大家一次的说明单个对象和多个对象,怎么处理内存泄露的问题.
单个内存泄露情况1:
为什么会造成这样的原因呢?就是因为创建对象后没有release,就造成了内存的泄露.怎么解决呢?我们来看下面的代码吧.
创建完后,如果不用就直接release就可以了.这是单个内存泄露的第一种情况.
单个内存泄露情况2:没有遵守内存管理的原则.
没有遵守内存的管理原则:谁创建,谁release;谁retain,谁release;谁引用,谁release.所以会造成内存的泄露,那么怎么解决呢?
直接在release一次就可以了,这是第二种情况.
单个内存泄露情况3:不当的使用了nil,造成了内存泄露.
为什么?是在对象创建过后,直接将nil赋值给了指向对象的指针,也就是指针dog的值一直是0,那么后面的一系列的代码所代表的都是0在run和0在release.解决的办法,就是不能在对象创建后,直接给对象赋值nil.
然后就是第四种内存泄露了:用对象作为参数传给另外一个对象或者在内部不当的使用了retain,也会造成内存泄露.
上面的情况就造成了内存泄露,下面就是解决办法.
上面所有的代码,只要当内存完全释放的时候就会调用delloc.
上面所有的都是有关单个内存的泄露问题.
二.多个对象的内存泄露问题
首先我们要知道为什么多个对象会有内存泄露问题呢?比如,我们可以假设一个人和一辆车,然后人开车去某个地方,最后是车在跑,最后车到达目的地了,然后创建的对象并没有释放,造成了内存的泄露.那么我就拿人开车去某个地方来说明内存泄露的问题.
这是Car的(.m)文件:
然后就是人的(.m)文件:
那么我们来看看main的部分:
最后运行的结果是人到达饿目的地.但是这里就有问题了,车的delloc和人得delloc并没有执行,那么就造成了内存的泄露了.那么怎么解决呢?
结果显示人的delloc和车的dello都执行了,那么又有问题了,那样做是不是很不方便呢?我们能不能用一个方法直接封装起来呢,这样就算外部在怎么的访问都是一样的,就不需要考虑野指针的问题了,那么怎么解决呢?我们来看看下面的解决代码(这种方法主要是针对创建多个对象的问题).
上诉所写得代码是在set方法里面直接控制,也是核心.管理原则是:如果一个类中,有其他类的对象(关联关系),set方法书写的时候,要判断是否是同一个对象,release旧的值,retain新的值.这是对多个对象的手动管理方法.
三.僵尸对象怎么检测
图一:
图二:
图三:
以上就是对内存的管理,也就是手动内存管理.有什么issue给我留言,我们一起讨论,谢谢!!!!!!
1 0
- 内存泄露之手动内存管理(MRC)
- MRC ARC 内存泄露 内存管理
- OC通讯录(MRC手动管理内存)
- iOS MRC手动内存管理 心得体会
- iOS MRC手动内存管理 心得体会
- 苹果开发 手动内存管理MRC
- 手动内存管理(MRC)转ARC
- OC 内存管理之MRC
- Objc内存管理之MRC
- OC-025.OC手动MRC内存管理@property的使用方法
- OC中内存管理之MRC
- 内存管理之手动管理
- 内存管理arc,mrc
- MRC内存管理1
- 内存管理- MRC
- 内存管理 ARC + MRC
- MRC内存管理
- iOS手动内存管理之对象持有对象可能存在的内存泄露问题
- Web前端-百度UEditor编辑器合入PHP网站
- udev创建设备的属性设置
- 使用maven创建一个web项目
- 编写安卓app程序显示当前系统时间
- 《Hadoop:The Definitive Guide 4th Edition》Chapter 17 Hive——A部分
- 内存泄露之手动内存管理(MRC)
- uva11100
- java,list,map,set数组
- C++四种类型转换
- 我的MYSQL学习心得(十五) 日志
- 异步编程 In .NET
- java后台接收数据
- Android View的可见属性
- Jsp学习笔记:javaBean属性命名规范