步骤
第0步,#import <objc/runtime.h>
要创建一个新类,首先调用objc_allocateClassPair。 然后使用class_addMethod和class_addIvar等函数设置类的属性。 完成构建类后,调用objc_registerClassPair。
参数
/**
* 创建一个新类和元类.
*
* @param superclass 这个类是新创建的类的父类,可以传入Nil去创建一个新根类.
* @param name 这个字符串是类的名字(例:"NSObject")
* @param extraBytes 一般传入0
* @return 新的类,如果返回的是Nil,那么就是这个类创建失败了(例:创建的是"NSObject"类,然而这个类已经存在了)
*/
objc_allocateClassPair(Class _Nullable superclass, const char * _Nonnull name,
size_t extraBytes)
/**
* 注册使用`objc_allocateClassPair`方法创建的类
*
* @param cls 需要注册的类(不能为Nil)
*/
objc_registerClassPair(Class _Nonnull cls)
这个objc_registerClassPair
方法中的cls不能为Nil.不然会引起崩溃
代码样例
/// 创建一个元类
Class class = objc_allocateClassPair([NSObject class], "Person", 0);
/// 添加方法
//class_addMethod(<#Class _Nullable __unsafe_unretained cls#>, <#SEL _Nonnull name#>, <#IMP _Nonnull imp#>, <#const char * _Nullable types#>)
/// 添加属性
//class_addIvar(<#Class _Nullable __unsafe_unretained cls#>, <#const char * _Nonnull name#>, <#size_t size#>, <#uint8_t alignment#>, <#const char * _Nullable types#>)
/// 注册元类
objc_registerClassPair(class);
代码执行详解
当仅仅只是allocateClassPair
时.这个Class其实是还未注册的
当代码走完registerClassPair
时,Class才算是注册成功