iOS开发-运行循环RunLoop介绍(一)

1.什么是运行循环RunLoop
从字面上理解就是运行循环、死循环、处于一个不断运行的状态。

2.运行循环RunLoop的基本作用
1)保持程序的持续运行
2)处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
3)节省CPU资源,提高程序性能:该做事时做事,该休息时休息
。。。。。

3.感受运行循环的存在

// 一般的Main函数
int main(int argc, char * argv[]) {
    NSLog(@"execute main function");  // 程序开始
    return 0;                // 程序结束
}

// 一个OC项目的Main函数

#import 
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

// 我们可以接受一下返回值
int main(int argc, char * argv[]) {
    @autoreleasepool {
        int returnValue = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
      NSLog(@"%d", returnValue);
      return returnValue;
    }
}
// 测试可以发现程序不会结束,也就是不会返回一个值。这是因为UIApplicationMain函数内部就启动了一个RunLoop
所以UIApplicationMain函数一直没有返回,保持了程序的持续运行
这个默认启动的RunLoop是跟主线程相关联的

4.iOS中访问RunLoop的两套API,一套是Foundation框架中的NSRunLoop,一套是Core Foundation框架中的CFRunLoopRef。
NSRunLoop和CFRunLoopRef都代表着RunLoop对象;
NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面);
关于RunLoop的苹果官方文档
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
CFRunLoopRef的开源资料
http://opensource.apple.com/source/CF/CF-1151.16/

5.RunLoop与线程的关系
1)每条线程都有唯一的一个与之对应的RunLoop对象;
2)主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建;
3)RunLoop在第一次获取时创建,在线程结束时销毁;

6.两套框架中获得RunLoop对象的方式

//Foundation
[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

//Core Foundation
CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
CFRunLoopGetMain(); // 获得主线程的RunLoop对象

你可能感兴趣的