Runloop、autoreleasepool的简单理解

1. Runloop

runloop是一种消息循环机制,每一个线程内部都有一个消息循环

只有主线程消息循环默认开启,子线程的消息循环默认不开启

1.1 Runloop的目的

保证程序不退出;

负责处理输入事件;

如果没有事件发生,会让程序进入休眠状态。

1.2 事件类型

Input Sources输入源 & Timer Source定时源;

输入源可以是键盘鼠标;定时源是NSTimer事件。
1.3 mode

(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。

 

posted @ 2016-09-18 16:09  简简单单0  阅读(292)  评论(0编辑  收藏  举报