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就是自动释放池的内部实现