Runloop、autoreleasepool的简单理解
1. Runloop
runloop是一种消息循环机制,每一个线程内部都有一个消息循环
只有主线程消息循环默认开启,子线程的消息循环默认不开启
1.1 Runloop的目的
保证程序不退出;
负责处理输入事件;
如果没有事件发生,会让程序进入休眠状态。
1.2 事件类型
Input Sources输入源 & Timer Source定时源;
(1)kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
(2)UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
(3)UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
(4)GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
(5)kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。
1.4 子线程中的消息循环
特点:子线程默认不开启消息循环,主线程默认开启消息循环
手动开启注意
执行完[[NSRunLoop currentRunLoop] run];后面的代码不会执行,也关不了循环。
可用[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]]; 代替
或(官方推荐用法,作为了解)
2. autoreleasepool
autorelease本质上是延迟释放,延迟调用release(当autoreleasePool中对象的引用计数都为1的调用release),对于每一个Runloop,系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,对象会自动被放入栈顶的AutoreleasePool中,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。