4-7 自动释放池

2019-04-08  本文已影响0人  Rumbles

1.AutoreleasePool的实现原理是什么

本质会调用两个方法
objc_autoreasePoolPush

void*AutoreasePoolPage::push

objc_autoreasePoolPop

自动释放池的数据结构:
栈为节点通过双向链表的方式组合而成的
是和线程一一对应的

push就是插入双向链表当中

pop 就是从最后进来的对象一个一个发送realease方法 释放掉

面试题:arr是如何释放的?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *arr = [NSMutableArray new]; 
}

当当次 runloop将要结束的时候调用 pop方法释放掉

2.双向链表·

NULL <--Node.    --> NULL
栈事向下增长的。低地址到高地址
栈是吃了吐

3. AutoreleasePool为何可以嵌套使用

创建多个page
哨兵对象

4.使用场景

当一个对象 对内存消耗特别大的时候。 插入 AutoreleasePool 释放掉

5.实现原理

AutoreleasePool。就是以栈为节点通过双向链表的方式组合而成的数据结构
autorelease方法会把对象存储到AutoreleasePoolPage的链表里。等到auto release pool被释放的时候,把链表内存储的对象删除。所以,AutoreleasePoolPage就是自动释放池的内部实现
上一篇下一篇

猜你喜欢

热点阅读