iOS 内存管理基本原则

我们知道objc中创建对象是存放在堆中的(基本数据类型除外,是由系统自己管理,并存放在栈中),系统不会自动释放堆中的内存。如果创建完的对象存放在堆中后并使用完没有得到及时的释放,会占用的内存。但是objc没有GC(垃圾回收机制),因此需要开发者手动管理内存。苹果公司共推出了3中内存管理机制:ARC(自动内存管理)、MRC(手动内存管理)、自动释放池。下面根据以下几个方面讨论一下内存管理。

1.内存管理的目的

a.不释放或者覆盖正在使用的内存空间;

b.释放已经不需要的内存空间,以防治内存泄漏。

2.内存管理的一些概念

ARC

ARC是苹果公司iOS5推出的新功能,代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了(通过指定的语法,让编译器在编译代码时,自动生成实例的引用计数管理部分代码。)。

好处:

1代码比以前需要手动管理内存,简单了,不需要时刻担心内存泄漏;
2
代码高速化,使用编译器来管理内存引用计数,减少了低效代码的可能性。
坏处:

1)一些老代码,以及以往的第三方库,使用起来比较麻烦。

MRC

MRC是手动内存管理。与其对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。

(1retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
(2
release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3)autorelease,该方法是将该对象内存的管理放到autoreleasepool中。

自动释放池

自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放。自动释放池本事销毁的时候,池子里面所有的对象都会做一次release操作。与之对应的方法是autorelease任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池)。

引用计数

任何一个oc对象都会有一个这样的属性retainCount,这个retainCount就是引用计数,当对象被创建的时候,该对象的引用计数为初始化值1,当retainCount为0时,会被该对象所占内存会被释放,使用retain的时候引用计数为+1。

3.内存管理的原则

内存管理的原则是:谁创建,谁释放;谁引用,谁管理。即当你使用new、alloc、copy或者mutablecopy创建对象的时候,该对象的引用计数为初始化值1,当你使用retain向对象发送消息时,你将拥有该对象的控制权,并且引用计数为+1,当你不在使用该对象的时候,你需要release或者autorelease释放该对象,使之引用计数-1,当引用计数为0时,该对象将被释放。

4.实际中一些使用操作

a.ARC和MRC混编

现在的开发过程中居多使用ARC,但是常常使用一些MRC的第三方的库,这时候我们需要使用-fno-objc-arc来进行标示,如果使用MRC混编ARC的时候,需要使用-fno-objc-mrc来标示ARC的文件。

5.面试中遇到的一些关于内存管理的问题

a.简述你理解的内存管理;

简述内存管理的原则,以及内存管理的方法就行。

b.给出一段代码来让你说出引用计数

知道使用new、alloc、copy或者mutable copy,引用计数为初始值1,再使用retain的话,引用计数为+1,使用release或者autorelease会使引用计数-1。然后根据实际情况来说明基本这种题soso的搞定。

你可能感兴趣的:(iOS记录,iOS,内存管理,ARC,MRC)