关于IOS 我对Runloop 的理解

其实,最近一直在找工作,但是现在的IOS的行情趋势很不好,然后呢,面过很多家公司,大大小小形形色色的公司,我回来也有总结,那么,很多面试官可能就会问到Runloop,这其实是考察一个程序员对OC底层的一个了解程度,今天先分享一下我对Runloop 的理解:

提到Runloop,可能对于一些老司机来说很了解了,但是有些刚入行的小朋友可能有点模糊,也没有系统的去了解过。

那么Runloop,我们首先从英文意思理解一下:运行回路 就是个循环!
我们可以说Runloop是一个特殊的死循环!为什么说它特殊呢
这个函数大家肯定不会陌生了
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
其实在我们程序刚启动的main函数里面就执行了Runloop了,以为这样可以保证我们的程序不死,也就是保证主线程不死!
那么,Runloop到底它是干什么用的呢,这么牛逼呢?
我总结了以下几点:
- 保证当前线程不退出!!
- 程序运行的时候,首先运行的主线程(主线程上Runloop)
- 接下来它要做事情啊:监听事件,触摸,时钟,网络事件(网络请求回调给你之后我们要通知外界)!
- 如果没有事件发生,Runloop处于等待状态!

这边我给大家举个栗子说明一下这些个情况:
首先呢,先创建一个NSTimer
一说创建timer,我们首先就想到这句代码:
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];

可是,我们有些小伙伴去不知道这句代码的原理和底层的实现,我可以把它拆分成这样写
把timer添加到一个Runloop 上
同样能够每1秒中调用timerMethod这个方法!
这个方法第一个参数,毋庸置疑就是NSTimer了,那么第二个参数是什么呢?模型,Runloop的模式。其实runloop一共有5种模式,但是我这里只介绍3种,以为其他两种是我们程序猿根本用不到的,都是系统内部使用的!那我写的是runloop的一个默认default的模式,还有一种就是UI模式UITrackingRunLoopMode ,最后一种等会再告诉你哦。

说到这里可能有人会蒙蔽了,我是谁,我在哪是吧,别着急,下面呢我要展示一下我的强项了–画图,我用图形展示一下Runloop 的基本原理哦

这张图呢就是Runloop其中两种最重要的模式

大家可以看到啊,我们的Runloop每个模式下都有这三个东西:source(事件源)、observer(观察者)、Timer(定时器),那我们今天先说一下timer,那旁边的哪个圈就是我们帅气的Runloop,非常的圆润,那么它做什么事呢,就是如果这两个模式下的timer被触发了,他就会过来处理一下,没事的时候它就休息睡觉。

那么有人会问了,如果这两个模式下timer同时召唤runloop,怎么办呢,我告诉你,一旦UI模式被触发,runloop就不会管其他模式的事了,以为IOS的UI都是在主线程做渲染的,所以UI模式最牛逼!
那么,什么时候会触发UI模式呢?只有滑动(触摸)屏幕的时候,系统会自动的跳到UI模式,即使你的默认模式的timer再叫runloop,说来啊,造作啊,runloop也会帅的一逼不会理你的。

接下来呢,我在视图上添加一个TextView

添加一个TextView

  • (void)timerMethod{
    NSLog(@”come here”);
    static int num = 0;
    NSLog(@”%d%@”,num,[NSThread currentThread]);
    num ++;
    }

结果是一开始我的Timer的timerMethod方法调用的很开心,当我滑动textView的时候就不调用,松手的时候就又调用起来。大家大概知道怎么回事啦吧,以为我之前代码设置的runloop是default模式,所以当UI模式被我滑动手势强行触发的时候,runloop不会管默认模式下的timer啦,所以就会停止调用,当我松手的时候runloop回到了休息状态,此时默认模式timer召唤runloop,之后runloop又过去默认模式啦,所以又恢复调用打印啦。

那么,解决方法是什么呢?最后就要很隆重的推出我们之前说的3种方法中的第三种模式叫做占位模式——-NSRunLoopCommonModes
这个其实就是UI和默认模式的一个集合体哈哈。换上这个模式之后呢就能很好的解决这个问题了。

那么,今天我先简单的说了一下runloop的基本原理啊,这是在主线程玩的runloop,之后会更新怎么开辟线程来玩Runloop,以及runloop在实际开发中的作用,并且完善source、和observer的讲解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值