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开发进阶》