网上搜集到的一些面试题,这里总结了一下答案。
一、讲一下对象
,类对象
,元类
?
- OC中,一个类就对应着一个
类对象
,类对象
代表着一个类;对象
是根据类对象
来创建的;类对象
是根据元类对象
创建的。 -
类对象
和元类对象
都只有一个,在程序运行开始时就会加载进内存中的。对象方法存放在类对象
的方法列表中,类方法存放在元类对象
的方法列表中。 - 每一个创建的对象都会有isa指针,
对象
的isa指针指向类对象
,类对象
的isa指针指向元类对象
,元类对象
的isa指针指向根元类对象
。根元类对象
的isa指针指向NSObject
.
isa指针?(对象的isa,类对象的isa,元类的isa都要说)
二、class_ro_t 和 class_rw_t 的区别?
-
对于一个类对象,其内部有一个结构体
class_data_bits_t
,这个结构体中有一个bits成员变量,在编译期间,这个bits成员指向的是class_ro_t
,在运行期间指向的是class_rw_t
. -
class_ro_t
和class_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
修饰与否的区别?
-
__block
修饰的变量能够在block中修改。 -
__block
声明的变量在运行时变为了一个结构体,结构体中会包含这个变量作为成员变量,所以在block内部和外部去修改这个变量时,本质变为了对结构体中的那个成员变量进行修改。
OC中block底层原理总结(下)
五、RunLoop的作用是什么?
- runloop是一个运行循环,和线程是一一对应的关系,主线程的runloop自动开启的,子线程的runloop默认不开启的。
- runloop循环处理着source0 、source1、timer、observer事件,对他们进行管理并分发给线程来执行,没有事件时会处于休眠状态,runloop处于循环中就保证了线程不会死掉。
- 一个runloop中可以有多个mode,iOS系统给我们提供了2个runloop Mode:
- kCFRunLoopDefaultMode (NSDefaultRunLoopMode)
- UITrackingRunLoopMode
我们可以将事件添加到对应的mode情景下触发处理,如果我们需要在所有mode情景都能触发,则可以将事件添加到kCFRunLoopCommonModes (NSRunLoopCommonModes)
中。
runloop 的 mode 作用是什么?
网友评论