RunLoop-AutoreleasePool
2016-05-26 10:42
337 查看
AutoreleasePool
App启动后,苹果在主线程 RunLoop 里注册了两个 Observer,其回调都是 _wrapRunLoopWithAutoreleasePoolHandler()。
第一个 Observer 监视的事件是 Entry(即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。其 order 是-2147483647,优先级最高,保证创建释放池发生在其他所有回调之前。
第二个 Observer 监视了两个事件: BeforeWaiting(准备进入休眠) 时调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;Exit(即将退出Loop) 时调用 _objc_autoreleasePoolPop() 来释放自动释放池。这个 Observer 的 order 是 2147483647,优先级最低,保证其释放池子发生在其他所有回调之后。
在主线程执行的代码,通常是写在诸如事件回调、Timer回调内的。这些回调会被 RunLoop 创建好的 AutoreleasePool 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 Pool 了。
App启动后,苹果在主线程 RunLoop 里注册了两个 Observer,其回调都是 _wrapRunLoopWithAutoreleasePoolHandler()。
第一个 Observer 监视的事件是 Entry(即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。其 order 是-2147483647,优先级最高,保证创建释放池发生在其他所有回调之前。
第二个 Observer 监视了两个事件: BeforeWaiting(准备进入休眠) 时调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;Exit(即将退出Loop) 时调用 _objc_autoreleasePoolPop() 来释放自动释放池。这个 Observer 的 order 是 2147483647,优先级最低,保证其释放池子发生在其他所有回调之后。
在主线程执行的代码,通常是写在诸如事件回调、Timer回调内的。这些回调会被 RunLoop 创建好的 AutoreleasePool 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 Pool 了。
相关文章推荐
- CodeForces621BWet Shark and Bishops
- linux passwd shadow文件
- linux下用python统计某个目录下指定后缀文件的个数
- shell之 while read a b的意思
- 你需要知道的 16 个 Linux 服务器监控命令
- Lync server 2013高可用环境快速查看客户端的版本信息及连接状态
- Linux命令 - Mount
- 发现tomcat死活编译不了项目的解决方法
- Linux scp 远程复制命令详解
- Linux下DNS服务器部署
- 关于ecplise导入项目之后在tomcat里无法添加的解决方法
- Nginx负载均衡
- Hadoop YARN常见问题以及解决方案
- linux后台运行python程序
- indy10 idpop3接收邮件标题乱码
- 架构的相关文章收集
- 用Delphi实现邮件附件收发功能(使用Pop3 和Smtp)
- OPENCV的CvMat定义犯的一个小小错误
- IT运维管理(安全篇)--浅谈企业数据安全存储的重要性
- 大杂烩, 硬盘安装Linux