本文围绕内存管理的几种方法展开叙述。
1.内存管理是什么?
内存管理,就是对内存资源进行优化。
2.内存管理的三种方法?
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、MRC(手动内存计数)、内存池。
3.MRC是什么?管理原则是什么?存在的问题?
MRC,全称MannulReference Counting,手动内存管理 (手动引用计数),需要程序员手动的创建对象申请内存,然后再手动的释放。
MRC管理内存的原则:谁创建,谁释放。
也就是说,在使用的过程中,谁retain,谁release;或者谁alloc,谁release。
在使用MRC时,当引用计数为0时,必须回收,引用计数不为0,则不回收;如果内存计数为0了,没回收,会造成内存泄露。 如果想使用已经创建好的某个对象(别人创建的),不能直接拿过去用,需要先retain(让计数+1),用完之后应该release(计数-1),否则会造成野指针。
PS:野指针(不知道指向哪里的指针),它指向了一块不属于它的内存,可能是别人的内存,也可能之前是自己的,但是被别人释放了。
避免野指针的方式就是释放之后,让指针等于nil,这个时候在重复释放,则不会提示错误。
nil:又名空,是操作系统持有的内存,任何人都夺不去的内存。
4.ARC是什么?存在的问题?
ARC是iOS 5推出的新功能,全称叫Automatic Reference Counting,自动引用计数。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
使用ARC,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。
使用ARC后,不允许调用release,retain、retainCount等方法。
允许重写dealloc,但是不允许调用[super dealloc],系统会默认调用[super dealloc]。
虽然ARC给我们编程带来的很多好多,但也可能出现内存泄露。如下面两种情况:
-
循环参照:A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
-
死循环:如果有个ViewController中有无限循环,也会导致即使ViewController对应的view消失了,ViewController也不能释放。
5.内存池是什么?
autorelease类似于release,但是不等同于它,release调用后引用计数马上-1。
autorelease是在创建对象的时候写的,表示加入自动释放池,当释放池销毁时,才调用引用计数-1。
自动释放池,需要手动创建。
当调用[pool drain]方法时,会调用池中得全部对象,release掉他们。
6.三种方法的优缺点?
ARC优点是使用起来比较简单,不用自己考虑内存问题等,在MRC时代你需要自己retain一个想要保持的对象,而现
在不需要了。现在唯一要做的是用一个指针指向这个对象,只要指针没有被置空,对象就会一直保持在堆上。当将指针指向新值时,原来的对象会被release一次。
ARC缺点是如果出现循环引用的时候,容易出现内存泄露。此外,许多第三方的库是用MRC写的,如果使用,需要做一定处理。
MRC优点是程序员对于内存的控制比较强,可以很好的解决内存问题。
MRC 缺点是需要手动的写大量代码管理内存,保证谁创建谁释放,避免空指针,要很仔细才可以。
autorelease优点:可以简化操作,由自动释放池管理。只有在自动释放池销毁时才对里面的对象进行销毁,程序员不用关心对象的销毁时间,也不用再去调用release。
autorelease缺点:因为是延迟释放,可以延长对象的生命周期。所以不要随意使用,因为对象生命周期延长,会一直持有内存,会减慢速度。
适合占内存小的对象使用。