IOS基础之 内存管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS基础之 内存管理相关的知识,希望对你有一定的参考价值。

一 基本原理

1.什么是内存管理

  移动设备的内存有限,每个app所能占用的内存是有限制的。

  当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象,变量。

  管理范围:任何继承了NSObject,对其他基本数据类型(int, char, float, double,struct,enum等)无效。

 

2.对象的基本结构

 技术分享

  每个OC对象都有自己的引用计数器,是一个整数,表示"对象被引用的次数",即有多少个类正在使用这个OC对象。

  每个OC对象内部专门有4个字节的存储空间来存储引用计数器。

     局部变量放在里,动态变量(对象)放在里。代码块执行完毕,栈里面的局部变量被销毁,但是堆里的东西是动态分布,不会被销毁,必须手动销毁,如果没有销毁会造成内存泄漏。(Java里没有指针变量,那么对象就会被自动回收)

 

3.引用计数器的作用

  当使用alloc, new 或者copy创建一个新对象时,新对象的引用计数器默认就是1。

     当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象计数器不为0,那么在真个程序运行过程,它占用的内存就不能被回收,除非整个程序已经退出。

 

4.引用计数器的操作

  给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身)。

  给对象发送一条retain消息,可以使引用计数器值-1。

  可以给对象发送 retainCount消息获得当前的引用计数器值。

 

5.对象的销毁

    当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收。

  当一个对象被销毁时,系统会自动向对象发送一条dealloc 消息。

  一般会重写dealloc方法,在这里释放相关资源。dealloc就像对象的遗言。

      一般重写了dealloc 方法,就必须调用 [super dealloc] ,并且放在最后面调用。

  不要直接调用dealloc方法。

 

总结:

    1)retain 计数器加1,返回对象本身。

    2)release:计数器减1,没有返回值。

    3)retainCount:获取当前计数器的值。

    4)dealloc: 当对象被回收时,就会调用。

                     一定要调用[super dealloc] ,这个调用放到最后。

    5)僵尸对象:所占内存已经被回收,僵尸对象不能被使用。

    6)野指针:指向僵尸对象(内存不可用)的指针,给野指针发送消息会出错。

    7)空指针:没有指向任何东西的指针(存储的东西是nil , NULL, 0 ), 向空指针发送消息不会报错

   

 

参考知识:

http://www.cnblogs.com/lianghui66/archive/2012/11/13/2768281.html

http://www.cnblogs.com/iflewless/p/3912604.html

http://www.cnblogs.com/langtianya/p/3722129.html

 

以上是关于IOS基础之 内存管理的主要内容,如果未能解决你的问题,请参考以下文章

iOS之深入解析Memory内存

iOS之内存管理(ARC)

iOS之深入解析内存管理MRC与ARC机制

iOS基础 ----- 内存管理

小林coding阅读笔记:操作系统篇之内存管理基础,虚拟内存分段分页

小林coding阅读笔记:操作系统篇之内存管理基础,虚拟内存分段分页