在運行時創建新類的流程:
- 使用 objc_allocateClassPair 創建新類(和元類,這就是函數名叫 objc_allocateClassPair 的原因吧)。
- 使用 class_addIvar 添加實例變量。
- 使用 class_addMethod 添加方法。
- 使用 objc_registerClassPair 將設置好的新類注冊到運行時。??
objc_allocateClassPair
Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes);
- 參數:超類、新建類的類名、類對象的額外空間(一般不需要)
- 返回:新類的類對象。如失敗返回
nil
。 - 可以通過調用
object_getClass(newClass)
獲得 metaclass 的對象。
class_addIvar
BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types);
- 只能在
objc_allocateClassPair
和objc_registerClassPair
之間調用。已經存在的類不能夠再添加實例變量。 - 不能對
metaclass
使用。
class_addMethod
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);
- 可以對已經存在的類使用(例如用在方法解析)。
- 如果需要添加類方法,可以對
metaclass
使用。 - 可以覆蓋超類的實現,但不能覆蓋自己類中已有的實現。
- 如果想覆蓋自己類中已有的實現,可以使用
method_setImplementation
。
參考: Objective-C Runtime(官方文檔)