0%

Autoreleasepool

Autoreleasepool

  • 孙源大神的博客 Autoreleasepool
  • 网上搜的

与runloop的关系

第一个 Observer :
监视的事件是 Entry (即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。

第二个 Observer :
监视了两个事件:BeforeWaiting(准备进入休眠)
会调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;

Exit(即将退出Loop)
会调用 _objc_autoreleasePoolPop( ) 来释放自动释放池。

  1. 子线程在使用autorelease对象时,如果没有autoreleasepool会在autoreleaseNoPage中懒加载一个出来。
  2. 在runloop的run:beforeDate,以及一些source的callback中,有autoreleasepool的push和pop操作,总结就是系统在很多地方都差不多autorelease的管理操作。
  3. 就算插入没有pop也没关系,在线程exit的时候会释放资源,执行AutoreleasePoolPage::tls_dealloc,在这里面会清空autoreleasepool。

注意点

  • 当产生了autorelease对象时,此对象又特别大, 例如图片、大字符串、大数据等等时,此时加上 autoreleasepool ,会更好,避免oom产生
  • 特别是在循环任务中执行代码,优先使用系统迭代器方法,因为系统迭代器帮我们写好了autoreleasepool
希望对您有所帮助,您的支持将是我莫大的动力!