码迷,mamicode.com
首页 > 其他好文 > 详细

NSRunLoop、RunLoop和AutoreleasePool

时间:2015-06-07 12:27:58      阅读:1696      评论:0      收藏:0      [点我收藏+]

标签:

1、NSRunloop

NSRunloop是一种消息循环机制,它会侦测输入源(input source)和定时源(timer source),然后做回调处理。主要作用使线程在没有任何事件处理的时候处于休眠状态,对于非主线程而言,可以防止线程在等候指令时候被杀掉(NSTimer调用)。其原理图如下:

技术分享

每个线程都有一个默认的NSRunloop。主线程的NSRunloop默认是运行的。非主线程的NSRunloop默认是没有运行的,需要为NSRunloop添加一个事件,然后去run。

2、runloop

那什么是一个runloop?一个UI事件,一个timer,一个系统delegate都称之为runloop(不是NSRunloop),runloop实际上是从接收消息,然后处理完消息的一个完整过程。

3、autoreleasePool

autorelease本质上是延迟释放,延迟调用release(当autoreleasePool中对象的引用计数都为1的调用release),对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,对象会自动被放入栈顶的AutoreleasePool中,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。只有以上提到了3种runloop才会自动创建autorelease pool,thread是不会自动创建的。

4、为什么对象在被释放前,打印出来的retainCount为1而不为0?

当对象最后一次执行release时,系统知道马上就要回收内存了,就没有必要再将retainCount减1了,因为不管减不减1,该对象都肯定会被回收,而对象被回收后,它的所有的内存区域,包括retainCount值也变得没有意义。不将这个值从1变成0,可以减少一次内存的操作,加速对象的回收。

参考:《iOS开发进阶》

         zyy的专栏

NSRunLoop、RunLoop和AutoreleasePool

标签:

原文地址:http://www.cnblogs.com/zmg333/p/4558145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!