iOS面试题

  1. objc_msgForward是干什么的,如果直接调用会发生什么?
    消息转发,有对应的方法可以调用,没有会崩溃
  2. runtime如何实现weak变量的自动置nil?
    用weak指向的内存地址作为key(weak对象的内存地址),用指向weak对象的所有weak指针地址组成的数组作为value,当此对象的引用计数为0时dealloc,假如weak指向的对象内存地址为a(即key),然后就会以a为键在这个weak表中进行搜索,找到所有以a为key的weak对象(即对象的那块内存),从而置为nil。

3.能否向编译后的类中添加实例变量,能否向运行时创建的类中添加实例变量,为什么?
不能向编译后的类中增加实例变量,因为编译后的类已经注册在runtime中,类结构体中的objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定,同时runtime会调用class_setIvarLayout或class_setWeakvarLayout 来处理strong weak 引用。所以不能向编译后的类中添加实例变量。
可以向运行时创建的类中添加实例变量,需要调用class_addIvar来添加,并且需要在objc_allocateClassPair之后和objc_registreClassPair之前调用class_addIvar进行实例变量的添加,原因此时实例变量的链表和所占内存都未确定。

4.runloop和线程之间的关系?
所有的线程都拥有对应的runloop,只有主线程的runloop是默认开启的。runloop可以让线程保活。可以让线程在没有任务的时候休息,有任务的时候执行

5.runloop中的mode的作用?

NSRunLoopCommonModes:伪模式,包含 NSDefaultRunLoopMode 和 UITrackingRunLoopMode,将事件源添加到 NSRunLoopCommonModes 中,这些事件源会在所有包含在 NSRunLoopCommonModes 中的 Mode 下处理。
NSDefaultRunLoopMode:默认的 Run Loop 模式,处理大多数事件,适用于大多数情况下的事件处理。
NSEventTrackingRunLoopMode:处理用户界面事件,如鼠标拖动,确保用户界面事件优先处理。
NSModalPanelRunLoopMode:处理模态面板的事件,如保存或打开面板,确保模态面板的事件优先处理。
UITrackingRunLoopMode:处理用户界面控件跟踪事件,如滚动,确保滚动事件优先处理。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容