1.什么是運(yùn)行循環(huán)RunLoop
從字面上理解就是運(yùn)行循環(huán)泵三、死循環(huán)、處于一個(gè)不斷運(yùn)行的狀態(tài)衔掸。
2.運(yùn)行循環(huán)RunLoop的基本作用
1)保持程序的持續(xù)運(yùn)行
2)處理App中的各種事件(比如觸摸事件烫幕、定時(shí)器事件、Selector事件)
3)節(jié)省CPU資源敞映,提高程序性能:該做事時(shí)做事较曼,該休息時(shí)休息
。振愿。捷犹。。冕末。
3.感受運(yùn)行循環(huán)的存在
// 一般的Main函數(shù)
int main(int argc, char * argv[]) {
NSLog(@"execute main function"); // 程序開(kāi)始
return 0; // 程序結(jié)束
}
// 一個(gè)OC項(xiàng)目的Main函數(shù)
#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;
}
}
// 測(cè)試可以發(fā)現(xiàn)程序不會(huì)結(jié)束萍歉,也就是不會(huì)返回一個(gè)值。這是因?yàn)閁IApplicationMain函數(shù)內(nèi)部就啟動(dòng)了一個(gè)RunLoop
所以UIApplicationMain函數(shù)一直沒(méi)有返回档桃,保持了程序的持續(xù)運(yùn)行
這個(gè)默認(rèn)啟動(dòng)的RunLoop是跟主線(xiàn)程相關(guān)聯(lián)的
4.iOS中訪(fǎng)問(wèn)RunLoop的兩套API翠桦,一套是Foundation框架中的NSRunLoop,一套是Core Foundation框架中的CFRunLoopRef。
NSRunLoop和CFRunLoopRef都代表著RunLoop對(duì)象;
NSRunLoop是基于CFRunLoopRef的一層OC包裝销凑,所以要了解RunLoop內(nèi)部結(jié)構(gòu)丛晌,需要多研究CFRunLoopRef層面的API(Core Foundation層面);
關(guān)于RunLoop的蘋(píng)果官方文檔
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
CFRunLoopRef的開(kāi)源資料
http://opensource.apple.com/source/CF/CF-1151.16/
5.RunLoop與線(xiàn)程的關(guān)系
1)每條線(xiàn)程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象斗幼;
2)主線(xiàn)程的RunLoop已經(jīng)自動(dòng)創(chuàng)建好了澎蛛,子線(xiàn)程的RunLoop需要主動(dòng)創(chuàng)建;
3)RunLoop在第一次獲取時(shí)創(chuàng)建蜕窿,在線(xiàn)程結(jié)束時(shí)銷(xiāo)毀谋逻;
6.兩套框架中獲得RunLoop對(duì)象的方式
//Foundation
[NSRunLoop currentRunLoop]; // 獲得當(dāng)前線(xiàn)程的RunLoop對(duì)象
[NSRunLoop mainRunLoop]; // 獲得主線(xiàn)程的RunLoop對(duì)象
//Core Foundation
CFRunLoopGetCurrent(); // 獲得當(dāng)前線(xiàn)程的RunLoop對(duì)象
CFRunLoopGetMain(); // 獲得主線(xiàn)程的RunLoop對(duì)象