面试总结 - RunLoop

就是运行时循环,一个程序能一直运行就是基于runloop。
每个线程如果想继续运行,不被释放,就必须有一个runloop来不停的跑圈,以来处理线程里面的各种事件和消息,主线程默认是开启一个runloop。也就是这个runloop才能保证我们的程序正常的运行。子线程是默认没有开启runloop的。

我们创建的程序不需要显示的创建runloop;每个线程,包括程序的主线程都有与之相应的runloop对象,主线程会自行创建并运行runloop,runloop处理的输入事件有两种不同的来源:输入源inputSource和定时源timer Source,输入源传递异步消息,通常来自于其他线程或者程序。定时源则传递同步消息,在特定时间或者一定的时间间隔发生。

除了处理input sources,runloop也会产生一些关于本身行为的通知。注册成为runloop的observer,可以接受到一些notification,做一些特定的处理。

一个runloop mode就是input sources,timer和observers的集合。每次执行runloop,都需要制定一个mode。在此期间,只有与该mode关联的source才会被监管和传递他们的事件,同样只有相关的observer被通知。 新建的自定义mode,至少需要一个inputsource或者timers 或者observers。

系统默认注册了5个mode:

1.kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行的。
*2.UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响。
*3.UIInitialLizationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后就不再使用了。
4.GSEventReceiveRunLoopMode:接受系统时间的内部Mode,通常用不到。
5.kCFRunLoopCommonModes:这个是占位的Mode,没有实际作用。
iOS对以上5个中model进行了封装
NSDefaultRunLoopMode(kCFRunLoopDefaultMode);
NSRunLoopCommonModes(kCFRunLoopCommonModes);

使用:

可以添加一个observer,来监听runloop的状态变化
kCFRunLoopEntry,即将进入Loop
kCFRunLoopBeforeTimers,即将处理 Timer
kCFRunLoopBeforeSources,即将处理 Source
kCFRunLoopBeforeWaiting,即将进入休眠
kCFRunLoopAfterWaiting,刚从休眠中唤醒
kCFRunLoopExit,即将退出Loop

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值