Ios面试复习--MRC内存管理

1.只有OC对象才需要进行内存管理的本质原因

--1.OC对象存放于堆中

--2.非OC对象存在栈中(栈内存会被系统自动回收)

2.堆和栈

更详尽内容参考Ios面试复习--内存分配

--1.栈:由操作系统自动进行释放和分配 ,(存放函数的参数值,局部变量值等),其操作方式类似于数据结构中的栈(先进后出)

--2.堆:一般由程序员手动分配释放,若不释放,程序结束时可能由操作系统回收,分配方式类似于链表

Ios面试复习--MRC内存管理_第1张图片
非oc对象和局部变量存在于栈中,而alloc 出的类的实例对象在堆中,返回由栈中的p引用


3.引用计数

任何一个对象,刚产生时,引用计数都为1(当使用alloc、new、copy 创建一个对象时,对象的引用计数器默认就是1

--1.retain 方法 引用计数+1

--2.release 方法 引用计数-1

--3.retainCount消息,获得对象当前的引用计数值

也就是说一次(alloc new copy)对应一次release ,一次retain 对应一次release

4.dealloc方法

当一个对象的引用计数为0时,该对象即将被销毁,占用的系统内存将被回收

对象即将被销毁是,系统会调用dealloc方法,重写dealloc   方法时 必须在最后调用[super dealloc]方法

5.野指针/空指针/僵尸对象

僵尸对象:已经被销毁的对象(不能再使用的对象)只要一个对象被释放了,我们就称这个对象为僵尸对象

野指针:指向僵尸对象(不可用内存)的指针

空指针:没有指向存储空间的指针(存储nil )(给空指针发送消息是没有反应的,不会提示报错,具体参考weak 和 assign)

开启僵尸对象监控

6.autorelease

autorelease 是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease 消息 会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面所有对象做一次release,所以并不保证该对象一定被释放,配合自动释放池,只是延迟了release 的调用时机,防止调用僵尸对象产生崩溃

在Ios程序运行过程中,会创建无数个池子,这些池子都是以栈的结构(先进后出)存在的

一定一定要在自动释放池中调用autorelease 才会自动release,

在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。

当一个对象调用autorelease方法时,会将这个对象放到位于栈顶的释放池中

当一个对象调用autoresease时,会将这个对象放到位于栈顶的释放池中(具体参考7.autoreleasepool 的更详细说明)

--1.autorelease 会返回对象本身

--2.调用autorelease 方法后对象的引用计数不变

Ios面试复习--MRC内存管理_第2张图片
利用autorelease

7.autoreleasepool

--1.autoreleasepool 

Ios面试复习--MRC内存管理_第3张图片
两种自动引用释放池的使用

autoreleasepool 注意点

--1.autorelease 一定要在 pool 中调用

--2.在自动释放池中创建的对象,一定要调用autorelease 方法,才会将对象放入自动释放池中

--3.不再自动释放池外创建的对象,若在自动释放池内进行autorelease 同样会被自动释放

Ios面试复习--MRC内存管理_第4张图片

在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。

当一个对象调用autorelease方法时,会将这个对象放到位于栈顶的释放池中

8.MRC下 集合对象 的内存管理

--1.若将一个对象添加到一个集合类型对象中(array dic .....) 那么集合对象会对对象进行一个retain 

--2.当集合类型对象释放后,会给其内部所有引用的对象发送一条release消息(对象不一定被销毁)

Ios面试复习--MRC内存管理_第5张图片

--3.当对象从集合对象中移除时,集合对象会堆这个对象发送一条release消息

Ios面试复习--MRC内存管理_第6张图片

9.苹果官方内存管理原则

谁创建谁release 

如果通过 alloc 、 new、 copy、 mutableCopy 来创建一个对象,需要调用release 或 autorelease

其中

--1.copy 的引用计数 具体参考 在MRC 下 Copy引用计数部分

--2.NSString 不同的初始化方式会 导致该对象在不同的存储区域 需要根据实际情况判断是否需要对其进行retain 具体参考  Ios面试复习--NSString的内存管理


你可能感兴趣的:(Ios面试复习--MRC内存管理)