问题引出:
当点击一个button的时候,是button调用这个方法,还是谁在调用这个方法?为什么会调用到这个方法?
先来看一段代码
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"hello world");
return 0;
}
上面一段代码运行之后就结束了,如果再次打印,需要打开再跑一遍。但是我们写的app程序运行之后是不会结束的,除非我们去双击home键去滑掉。那么我们的app不会主动结束是怎么实现的呢?
如果想让上述代码不结束,我们可以加一个while语句,代码如下:
int main(int argc, const char * argv[])
{
@autoreleasepool {
int i = 0;
// 死循环
while (YES) {
printf("请输入一个整数,0表示退出:");
scanf("%d", &i);
NSLog(@"%d", i);
if (i == 0) {
break;
}
}
}
return 0;
}
一、what
runloop的字面理解的意思是跑圈,循环。它的作用就类就类似于上面代码While代码的作用。
一般情况下在iOS 开发中用不到,因为系统都给我们封装好了。
二、runloop的作用(目的)
- 保证程序不退出
- 负责监听事件,iOS中触摸,时钟,网络事件等等
- 如果没有事情发生,就会进入休眠状态,节约性能
runloop有以下3个部分
image.png
2.1CFRunLoopTimer
上代码
NSTimer *timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
//告诉runloop.
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
RunLoop有5种模式,以下3种最常用
- NSDefaultRunLoopMode //苹果建议放时钟和网络事件
- UITrackingRunLoopMode //优先级最高,只有UI事件才能唤醒
- NSRunLoopCommonModes //默认包括上面第一和第二,占位模式,并不是一个真正的模式
注意:如果在同一个线程中,UIUITrackingRunLoopMode事件优先级最高,会阻碍NSDefaultRunLoopMode ,造成卡顿现象,解决的方法是添加NSRunLoopCommonModes
2.2CFRunLoopSource
Source 事件源
按照函数调用栈可以分为2类
- source0
处理App内部事件,App自己负责管理(触发),如UIEvent,CFSocket - source1
由RunLoop和内核管理,Mach port驱动 如CFMach、CFMessage
2.3CFRunLoopObserver
三、runloop的深入理解
下面是一位简友的理解iOS runloop
我在网上看了一下@sunnnyxx 关于runloop的视频, http://v.youku.com/v_show/id_XODgxODkzODI0.html 或者搜索:iOS线下分享《RunLoop》by 孙源@sunnyxx
这个简友写的不错IOS---实例化讲解RunLoop
iOS---RunLoop深度剖析
三、利用Runloop进行性能优化
三、runloop相关的面试题
1.阿里一面 runloop内部实现逻辑
网友评论