main函數爲什麼是一直運行的?
RunLoop整個流程圖
#import "MCObject.h"
@implementation MCObject
static NSThread *thread = nil;
// 標記是否要繼續事件循環
static BOOL runAlways = YES;
+ (NSThread *)threadForDispatch{
if (thread == nil) {
@synchronized(self) {
if (thread == nil) {
// 線程的創建
thread = [[NSThread alloc] initWithTarget:self selector:@selector(runRequest) object:nil];
[thread setName:@"com.imooc.thread"];
//啓動
[thread start];
}
}
}
return thread;
}
+ (void)runRequest
{
// 創建一個Source
CFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
// 創建RunLoop,同時向RunLoop的DefaultMode下面添加Source
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
// 如果可以運行
while (runAlways) {
@autoreleasepool {
// 令當前RunLoop運行在DefaultMode下面
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);
}
}
// 某一時機 靜態變量runAlways = NO時 可以保證跳出RunLoop,線程退出
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRelease(source);
}
@end