OC的内存管理

版权声明: https://blog.csdn.net/baidu_33440774/article/details/79655664

1、什么是内存管理

程序在运行的过程中通常通过以下行为,来增加程序的的内存占用。(1)创建一个OC对象(2)定义一个变量(3)调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 当程序所占用的内存较多时,系统就会发出内存警告,这时就得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象、变量等 如果程序占用内存过大,系统可能会强制关闭程序,造成程序崩溃、闪退现象,影响用户体验


所以,我们需要对内存进行合理的分配内存、清除内存,回收那些不需要再使用的对象。从而保证程序的稳定性。


那么,那些对象才需要我们进行内存管理呢?

  • 任何继承了NSObject的对象需要进行内存管理
  • 而其他非对象类型(int、char、float、double、struct、enum等) 不需要进行内存管理

这是因为

  • 继承了NSObject的对象的存储在操作系统的里边。
  • 操作系统的:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表
  • 非OC对象一般放在操作系统的里面
  • 操作系统的:由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出)

2、 内存管理模型

提供给Objective-C程序员的基本内存管理模型有以下3种:

  • 自动垃圾收集(iOS运行环境不支持)
  • 手工引用计数和自动释放池(MRC)
  • 自动引用计数(ARC)

3、如何进行内存管理

苹果是采用引用计数的原理进行内存管理的,当使用alloc、new或copy创建一个对象时,对象的引用计数为1;当对象调用retain时,引用计数会加1;当对象调用release或autorelease时,引用计数会减1;当对象的引用计数为0的时候,会调用dealloc方法,销毁对象。

4、 野指针和空指针

只要一个对象被释放了,我们就称这个对象为僵尸对象(不能被使用的对象);当一个指针指向一个僵尸对象(不可用的内存),则称这个指针为野指针,给野指针发送消息就会报错(EXC_BAD_ACCESS错误),为了避免野指针发送消息报错,对象释放时,会将对象设置为nil,向空指针发送消息没有任何反应

5、 自动释放池

当我们不在使用一个对象时,需要将其内存释放,但是有时候我们不知道应该何时释放,为了解决这个问题,OC提供了autorelease的方法。

autorelease是一种支持自动引用计数的内存管理方式,只要给对象发送一条autorelease的消息,该对象就会被放入到自动释放池中,当自动释放池销毁的时候,会对池里的所有的对象做一次release的操作。(只有当引用计数为0的时候,对象才会被销毁)

autorelease方法会返回对象自身,调用完autorelease方法后,对象的引用计数不变。

好处:不用关心对象释放的时间

原理实质:把release的调用延迟了,对于每一个autorelease,系统只是把对象放入到了autorelease pool中,当pool释放的时候,pool中的所有对象都会调用release。

6、ARC 自动管理内存(Automatic Reference Counting)

自动引用计数,iOS5推出的,用来解决手动管理内存的麻烦。

使用ARC后,系统会自动检测何时需要保持对象,何时需要释放对象,编译器会管理好内存,会在合适的地方插入retain、release或autorelease,通过生成正确的代码去保持对象或释放对象。

猜你喜欢

转载自blog.csdn.net/baidu_33440774/article/details/79655664