iOS 啥是RunLoop? RunLoop有啥用?

·  阅读 736

###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%,如下图

upload-images.jianshu.io/upload_imag…

然后我们换一种方式,自己写一个死循环。

int main(int argc, char * argv[]) {
    @autoreleasepool {
        while(1);
        return 0;
    }
}

复制代码

再看看CPU占用率

CPU占用-手写死循环.png
很明显,同样是死循环,RunLoop就是这么优秀。 从而验证了RunLoop节约CPU资源,提高程序性能的作用。

分类:
iOS
标签:
分类:
iOS
标签: