Autoreleasepool
- 孙源大神的博客 Autoreleasepool
- 网上搜的
与runloop的关系
第一个 Observer :
监视的事件是 Entry (即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。
第二个 Observer :
监视了两个事件:BeforeWaiting(准备进入休眠)
会调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;
Exit(即将退出Loop)
会调用 _objc_autoreleasePoolPop( ) 来释放自动释放池。
- 子线程在使用autorelease对象时,如果没有autoreleasepool会在autoreleaseNoPage中懒加载一个出来。
- 在runloop的run:beforeDate,以及一些source的callback中,有autoreleasepool的push和pop操作,总结就是系统在很多地方都差不多autorelease的管理操作。
- 就算插入没有pop也没关系,在线程exit的时候会释放资源,执行AutoreleasePoolPage::tls_dealloc,在这里面会清空autoreleasepool。
注意点
- 当产生了autorelease对象时,此对象又特别大, 例如图片、大字符串、大数据等等时,此时加上 autoreleasepool ,会更好,避免oom产生
- 特别是在循环任务中执行代码,优先使用系统迭代器方法,因为系统迭代器帮我们写好了autoreleasepool