请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

例如

@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开始的对吧?

正在回答 回答被采纳积分+3

1回答

于海 2019-11-27 09:17:51

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

0 回复 有任何疑惑可以回复我~
  • 提问者 瞅瞅 #1
    外层的autoreleasePoolPage双向链表的下一个节点child指向就是嵌套的内层autoreleasePoolPage对吧
    回复 有任何疑惑可以回复我~ 2019-11-27 09:30:48
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信