1.什么是運(yùn)行循環(huán)RunLoop
從字面上理解就是運(yùn)行循環(huán)、死循環(huán)、處于一個不斷運(yùn)行的狀態(tài)。
2.運(yùn)行循環(huán)RunLoop的基本作用
1)保持程序的持續(xù)運(yùn)行
2)處理App中的各種事件(比如觸摸事件、定時器事件、Selector事件)
3)節(jié)省CPU資源,提高程序性能:該做事時做事,該休息時休息
。。。。。
3.感受運(yùn)行循環(huán)的存在
// 一般的Main函數(shù)
int main(int argc, char * argv[]) {
NSLog(@"execute main function"); // 程序開始
return 0; // 程序結(jié)束
}
// 一個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;
}
}
// 測試可以發(fā)現(xiàn)程序不會結(jié)束,也就是不會返回一個值。這是因?yàn)閁IApplicationMain函數(shù)內(nèi)部就啟動了一個RunLoop
所以UIApplicationMain函數(shù)一直沒有返回,保持了程序的持續(xù)運(yùn)行
這個默認(rèn)啟動的RunLoop是跟主線程相關(guān)聯(lián)的
4.iOS中訪問RunLoop的兩套API,一套是Foundation框架中的NSRunLoop,一套是Core Foundation框架中的CFRunLoopRef。
NSRunLoop和CFRunLoopRef都代表著RunLoop對象;
NSRunLoop是基于CFRunLoopRef的一層OC包裝,所以要了解RunLoop內(nèi)部結(jié)構(gòu),需要多研究CFRunLoopRef層面的API(Core Foundation層面);
關(guān)于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與線程的關(guān)系
1)每條線程都有唯一的一個與之對應(yīng)的RunLoop對象;
2)主線程的RunLoop已經(jīng)自動創(chuàng)建好了,子線程的RunLoop需要主動創(chuàng)建;
3)RunLoop在第一次獲取時創(chuàng)建,在線程結(jié)束時銷毀;
6.兩套框架中獲得RunLoop對象的方式
//Foundation
[NSRunLoop currentRunLoop]; // 獲得當(dāng)前線程的RunLoop對象
[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象
//Core Foundation
CFRunLoopGetCurrent(); // 獲得當(dāng)前線程的RunLoop對象
CFRunLoopGetMain(); // 獲得主線程的RunLoop對象