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%,如下图
![](https://img.haomeiwen.com/i2395731/5465fb86e65464e1.png)
然后我们换一种方式,自己写一个死循环。
int main(int argc, char * argv[]) {
@autoreleasepool {
while(1);
return 0;
}
}
再看看CPU占用率
![](https://img.haomeiwen.com/i2395731/9b5e1f1db25ca500.png)
很明显,同样是死循环,
RunLoop
就是这么优秀。从而验证了
RunLoop
节约CPU资源,提高程序性能的作用。
网友评论