Aeea8ffd5ece0bbd2a033ae78c5dd2e1
iOS面试真题·百度深圳公司第1轮面试

在百度找人内推简历后,过了几天,一个周五晚上7点多就来了电话面试,电话面完后,第二周的周一百度HR就来了电话,约一个现场面试。这里先回忆一下百度公司的电话面试真题。

面试形式 电话面试
面试节点 第1轮
面试时间 6月某周五晚上7点
面试地点 无规定

1.你讲讲你对Runloop的理解吧?


解析:

  • runloop的两种形式:

    • 分别属于NSFoundation框架和CoreFoudation框架的NSRunLoop和CFRunLoopRef。
  • runloop的创建:
    • 苹果不允许直接创建 RunLoop,它只提供了自动获取的函数
NSRunLoop *mainRunloop = [NSRunLoop mainRunLoop]; // 获得主线程对应的 runloop对象
NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop]; // 获得当前线程对应的runloop对象
CFRunLoopRef maiRunloop = CFRunLoopGetMain(); // 获得主线程对应的 runloop对象
CFRunLoopRef maiRunloop = CFRunLoopGetCurrent(); // 获得当前线程对应的runloop对象
  • runloop与线程的关系:

    • 每条线程都有唯一的一个与之对应的RunLoop对象。
    • 主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建。
    • RunLoop在第一次获取时创建,在线程结束时销毁。
    • Runloop对象是利用字典来进行存储,而且 Key:线程 -- Value:线程对应的 runloop。
  • 三个输入源:
    • 如下表所示:
输入源 说明
CFRunLoopSourceRef (输入源) CFRunLoopSourceRef 是事件产生的地方。Source有两个版本:Source0 和 Source1。
CFRunLoopTimerRef (定时源) CFRunLoopTimerRef 是基于时间的触发器,它和 NSTimer 是 Toll-Free Bridged 的,可以混用。其包含一个时间长度和一个回调(函数指针)。当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。
CFRunLoopObserverRef (观察者) CFRunLoopObserverRef 是观察者,每个 Observer 都包含了一个回调(函数指针),当 RunLoop 的状态发生变化时,观察者就能通过回调接受到这个变化。
  • 五个mode:
    • Runloop总是运行在某种特定的CFRunLoopModeRef下:
    • 通过CFRunloopRef对应结构体的定义可以很容易知道每种Runloop都可以包含若干个Mode,每个Mode又包含Source/Timer/Observer。每次调用Runloop的主函数__CFRunLoopRun()时必须指定一种Mode,这个Mode称为 _currentMode
    • 完整的mode name如下表所示:
mode name 说明
kCFRunLoopDefaultMode App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
UIInitializationRunLoopMode 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode 接受系统事件的内部 Mode,通常用不到
kCFRunLoopCommonModes 这是一个占位用的Mode,作为标记kCFRunLoopDefaultMode和UITrackingRunLoopMode用,并不是一种真正的Mode
  • 相应的几个应用
top Created with Sketch.