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 <UIKit/UIKit.h>
#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对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容