关于iOS子线程上的autorelease对象释放问题?
关注者
5被浏览
9,5233 个回答
要弄清线程-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只可以获取,不可以手动创建。