关于autoreleasepool多层嵌套的哨兵对象作用

来源:6-7 自动释放池相关面试问题

瞅瞅

2019-11-27

例如

@autoreleasepool{
    NSArray *array1 = [NSArray arrayWithArray:@[@1]];
	@autoreleasepool{
	    NSArray *array2 = [NSArray arrayWithArray:@[@1,@2]];
	}
	NSArray *array3 = [NSArray arrayWithArray:@[@1,@2,@3]];
}

以上autoreleasepool嵌套的过程是
先插入了一个哨兵对象nil(1),
将array1入栈,
然后再插入一个哨兵对象nil(2),
将array2入栈,
接着内层释放池pop,next开始回退
array2 release出栈,
next回退到哨兵对象nil(2)的位置,
将array3入栈,
外层释放池pop,next回退,
array3 release,
array1 release,
next回退到哨兵对象nil(1)的位置,结束。

其实autoreleasepool多层嵌套中的哨兵对象 就是起到标示位的作用,用来告知某一层嵌套的autoreleasepool的起始位置,这样理解对吧?于老师

另外 如您PPT中描述,那这个AutoreleasepoolPage的栈底,应该是从main函数的@autoreleasepool开始的对吧?

写回答

1回答

于海

2019-11-27

arrayWithArray函数系统实现应该是有加autorelease的。其余部分描述基本正确

0
1
瞅瞅
外层的autoreleasePoolPage双向链表的下一个节点child指向就是嵌套的内层autoreleasePoolPage对吧
2019-11-27
共1条回复

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程