RunLoop是什么
- 顾名思义翻译过来就是 运!行!循!环!
-
RunLoop实际上是一个对象,这个对象提供了一个入口函数CFRunLoopRun(void) -
RunLoop是一个牛逼的do...while死循环
RunLoop的作用什么
1.使程序持续运行
2.节约CPU资源 提高程序性能
3.处理各种事件(触摸、定时器、performSelectord等等)
如何令程序持续运行?
在我们的main.h中,如果main函数retrun 0,那么当运行到return时,程序就会退出。
int main(int argc, char * argv[]) {
@autoreleasepool {
return 0;
}
}
当我们新建一个工程时,main函数会默认返回UIApplicationMain。UIApplicationMain会自动创建一个RunLoop:main loop,从而实现不断循环,来令程序持续运行。
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));;
}
}
为什么是个死循环?
typedef CF_ENUM(SInt32, CFRunLoopRunResult) {
kCFRunLoopRunFinished = 1,
kCFRunLoopRunStopped = 2,
kCFRunLoopRunTimedOut = 3,
kCFRunLoopRunHandledSource = 4
};
void CFRunLoopRun(void) { //入口函数
int32_t result; //创建不赋值,result = nil;
do {
result = CFRunLoopRunSpecific(CFRunLoopGetCurrent(), kCFRunLoopDefaultMode, 1.0e10, false);
CHECK_FOR_FORK();
} while (kCFRunLoopRunStopped != result && kCFRunLoopRunFinished != result);
}
只要RunLoop的状态result 不等于kCFRunLoopRunStopped或kCFRunLoopRunFinished就会一直执行下去。
当result 等于kCFRunLoopRunStopped或kCFRunLoopRunFinished时,程序就会退出。
所以说是个死循环。
这个死循环牛逼在哪?和一般的死循环的区别在哪?
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));;
}
}
我们新创建一个工程,main.h一般情况是这样的,程序运行起来时,CPU占用为0%,如下图
CPU占用-RunLoop.png
然后我们换一种方式,自己写一个死循环。
int main(int argc, char * argv[]) {
@autoreleasepool {
while(1);
return 0;
}
}
再看看CPU占用率
CPU占用-手写死循环.png
很明显,同样是死循环,
RunLoop就是这么优秀。从而验证了
RunLoop节约CPU资源,提高程序性能的作用。












网友评论