美文网首页iOS开发者
iOS高级开发一份面试题附答案(二)

iOS高级开发一份面试题附答案(二)

作者: Sweet丶 | 来源:发表于2020-04-10 16:44 被阅读0次

    网上搜集到的一些面试题,这里总结了一下答案。

    一、讲一下对象类对象元类
    1. OC中,一个类就对应着一个类对象类对象代表着一个类;对象是根据类对象来创建的;类对象是根据元类对象创建的。
    2. 类对象元类对象都只有一个,在程序运行开始时就会加载进内存中的。对象方法存放在类对象的方法列表中,类方法存放在元类对象的方法列表中。
    3. 每一个创建的对象都会有isa指针,对象的isa指针指向类对象类对象的isa指针指向元类对象元类对象的isa指针指向根元类对象根元类对象的isa指针指向NSObject.
      isa指针?(对象的isa,类对象的isa,元类的isa都要说)
    二、class_ro_t 和 class_rw_t 的区别?
    1. 对于一个类对象,其内部有一个结构体class_data_bits_t,这个结构体中有一个bits成员变量,在编译期间,这个bits成员指向的是class_ro_t,在运行期间指向的是class_rw_t.

    2. class_ro_tclass_rw_t内部都存放了属性、实例变量、方法、协议等等。在运行时,生成的class_rw_t先从class_ro_t中拷贝内容,再从分类等结构中添加信息,所以class_rw_t包含了class_ro_t的内容。

    三、动态地创建一个类的方式?
    // 例如创建一个NSError的子类:
    Class newClass =
        objc_allocateClassPair([NSError class], "RuntimeErrorSubclass", 0);
    class_addMethod(newClass, @selector(report), (IMP)ReportFunction, "v@:");
    objc_registerClassPair(newClass);
    

    创建一个子类的同时也会创建相应的元类对象,所以里面的方法是带有“Pair”

    四、变量被__block修饰与否的区别?
    1. __block修饰的变量能够在block中修改。
    2. __block声明的变量在运行时变为了一个结构体,结构体中会包含这个变量作为成员变量,所以在block内部和外部去修改这个变量时,本质变为了对结构体中的那个成员变量进行修改。
      OC中block底层原理总结(下)
    五、RunLoop的作用是什么?
    1. runloop是一个运行循环,和线程是一一对应的关系,主线程的runloop自动开启的,子线程的runloop默认不开启的。
    2. runloop循环处理着source0 、source1、timer、observer事件,对他们进行管理并分发给线程来执行,没有事件时会处于休眠状态,runloop处于循环中就保证了线程不会死掉。
    3. 一个runloop中可以有多个mode,iOS系统给我们提供了2个runloop Mode:
    • kCFRunLoopDefaultMode (NSDefaultRunLoopMode)
    • UITrackingRunLoopMode
      我们可以将事件添加到对应的mode情景下触发处理,如果我们需要在所有mode情景都能触发,则可以将事件添加到kCFRunLoopCommonModes (NSRunLoopCommonModes)中。
      runloop 的 mode 作用是什么?

    相关文章

      网友评论

        本文标题:iOS高级开发一份面试题附答案(二)

        本文链接:https://www.haomeiwen.com/subject/eqrcmhtx.html