美文网首页
iOS 进阶 03--啥是RunLoop? RunLoop有啥用

iOS 进阶 03--啥是RunLoop? RunLoop有啥用

作者: 尤先森 | 来源:发表于2019-03-01 16:34 被阅读1次

RunLoop是什么

  1. 顾名思义翻译过来就是 运!行!循!环!
  2. RunLoop实际上是一个对象,这个对象提供了一个入口函数CFRunLoopRun(void)
  3. 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函数会默认返回UIApplicationMainUIApplicationMain会自动创建一个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 不等于kCFRunLoopRunStoppedkCFRunLoopRunFinished就会一直执行下去。
result 等于kCFRunLoopRunStoppedkCFRunLoopRunFinished时,程序就会退出。
所以说是个死循环。

这个死循环牛逼在哪?和一般的死循环的区别在哪?
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资源,提高程序性能的作用。

相关文章

网友评论

      本文标题:iOS 进阶 03--啥是RunLoop? RunLoop有啥用

      本文链接:https://www.haomeiwen.com/subject/nqeduqtx.html