关于iOS子线程上的autorelease对象释放问题?

autorelease对象的释放条件是runloop一个循环的某个步骤进行释放。 那有一个问题,如果我在子线程上建立一个autorelease对象,这…
关注者
5
被浏览
9,523

3 个回答

iOS高级开发之自动释放池AutoreleasePool原理分析-压栈和出栈
461 播放
发布于 2021-12-11 11:13· 257 次播放

要弄清线程-runloop-autoreleasepool之间的关系。

主线程的runloop是默认创建的,系统会监听runloop两种事件:

(1)即将进入runloop时,会创建一个autoreleasepool。

(2)runloop即将休眠时,会释放autoreleasepool并创建一个新的autoreleasepool;runloop即将退出时,会释放autoreleasepool。

而autoreleasepool在释放时,会对插入到pool中的对象发送release消息。

所以,runloop每次迭代结束,autoreleasepool释放,aurelease对象释放。


子线程的runloop是手动获取的,在你获取的时候系统会创建一个runloop并返回,所以你手动获取到的runloop其实是系统刚创建好的。

如果不能理解为什么子线程的runloop为什么需要手动获取,想一想,在子线程开启一个定时器必须要让当前runloop run起来才能有效。

子线程的autoreleasepool也需要手动获取,但区分情况,一般系统提供的block如usingBlock和GCD提供的block内部都会自动包裹一个autoreleasepool,不用手动加。但是你自己通过其他方式创建的子线程,在线程内部需要手动获取autoreleasepool,防止局部内存使用峰值过高或发生其他内存问题,最后,autoreleasepool释放时,也会对其管理的对象发送release消息。


runloop只可以获取,不可以手动创建。