iOS面试题-RunLoop

2019-11-15  本文已影响0人  Peter杰

1. RunLoop和线程的关系

  1. 每条线程都有唯一的一个RunLoop对象与之对应的
  2. 主线程的RunLoop是自动创建并启动,子线程的RunLoop需要手动创建
    3.RunLoop会在线程结束时销毁
  3. 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建,子线程的RunLoop创建步骤如下:
    • 在子线程中调用[NSRunLoop currentRunLoop]创建RunLoop对象(懒加载,只创建一次)
    • 获得RunLoop对象后要调用run方法来启动一个运行循环
    // 启动RunLoop
     [[NSRunLoop currentRunLoop] run];
    
    • RunLoop的其他启动方法
    // 第一个参数:指定运行模式
    // 第二个参数:指定RunLoop的过期时间,即:到了这个时间后RunLoop就失效了
    [[NSRunLoop currentRunLoop] runMode:kCFRunLoopDefaultMode beforeDate:[NSDate distantFuture]];
    

2. RunLoop的mode作用是什么?

  1. 用来控制一些特殊操作只能在指定模式下运行,一般可以通过指定操作的运行mode来控制执行时机,以提高用户体验
  2. 系统默认注册了5个Mode
    • kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行,对应OC中的:NSDefaultRunLoopMode
    • UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响
    • kCFRunLoopCommonModes:这是一个标记Mode,不是一种真正的Mode,事件可以运行在所有标有common modes标记的模式中,对应OC中的NSRunLoopCommonModes,带有common modes标记的模式有:UITrackingRunLoopMode和kCFRunLoopDefaultMode
    • UIInitializationRunLoopMode:在启动 App时进入的第一个 Mode,启动完成后就不再使用
    • GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到


3.猜想runloop内部是如何实现的?

4.不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)

5.苹果是如何实现autoreleasepool的?

objc_autoreleasepoolPush
objc_autoreleasepoolPop
objc_aurorelease
上一篇 下一篇

猜你喜欢

热点阅读