Runtime 提供大量的函数,用来操作类与对象,其中
class_
为前缀objc_
或 object_
为前缀获取类名
const char * class_getName( Class cls );
获取父类
Class class_getSuperclass(Class cls);
cls
为 nil
或根类时,返回 nil
判断给定的类是否为元类
BOOL class_isMetaClass(Class cls);
cls
不是元类或为 nil
时,返回 NO
size_t class_getInstanceSize(class cls);
objc_class
中,所有成员变量,属性的信息,存放在链表 ivars
中 (上面对 objc_class
定义中有)ivars
是一个数组,其中的每个元素为 Ivar
类型的指针获取类中指定的 实例成员变量 的信息,通过名称指定
Ivar class_getInstanceVariable ( Class cls, const char *name );
typedef struct objc_ivar *Ivar;
获取 类成员变量 的信息
Ivar class_getClassVariable ( Class cls, const char *name );
添加成员变量
BOOL class_addIvar ( Class cls, const char *name, size_t size, uint8_t alignment, const char *types );
获取整个成员变量列表
Ivar * class_copyIvarList ( Class cls, unsigned int *outCount );
outcount
返回数组的大小获取指定属性
objc_property_t class_getProperty ( Class cls, const char *name );
获取属性列表
objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount );
为类添加属性
BOOL class_addProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );
替换类的属性
void class_replaceProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );
对 objc_class
中 methodLists
的操作
添加方法
BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types );
NO
method_setImplementation
imp 所指向的函数实现,至少需要有两个参数 self
和 _cmd
void myMethodIMP(id self, SEL _cmd)
{
// implementation ....
}
获取实例方法
Method class_getInstanceMethod ( Class cls, SEL name );
获取类方法
Method class_getClassMethod ( Class cls, SEL name );
获取所有实例方法,包装在一个数组中
Method * class_copyMethodList ( Class cls, unsigned int *outCount );
class_copyMethodList(object_getClass(cls), &count)
替换方法的实现
IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );
获取方法的具体实现
IMP class_getMethodImplementation ( Class cls, SEL name );
IMP class_getMethodImplementation_stret ( Class cls, SEL name );
判断类实例是否响应指定的方法
BOOL class_respondsToSelector ( Class cls, SEL sel );
NSObject
中,通常使用的是 respondsToSelector:
或 instancesRespondToSelector:
添加协议
BOOL class_addProtocol ( Class cls, Protocol *protocol );
判断类是否实现指定协议
BOOL class_conformsToProtocol ( Class cls, Protocol *protocol );
NSObject
世界中,使用 conformsToProtocol:
获取类实现的协议列表
Protocol * class_copyProtocolList ( Class cls, unsigned int *outCount );
创建一个新类或元类
Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes );
superclass
需要指定为 nil
extraBytes
分配给类对象尾部的索引 ivars 的字节数,一般为 0动态创建类的步骤
objc_allocateClassPair
创建类class_addMethod
, class_addIvar
添加方法和实例变量或属性objc_registerClassPair
注册类注册类
void objc_registerClassPair ( Class cls );
销毁一个类,及其相关的类
void objc_disposeClassPair ( Class cls );
创建类实例
id class_createInstance ( Class cls, size_t extraBytes );
extraBytes
表示分配的额外字节数,用于存储在类定义中所定义的实例变量之外的实例变量之外的变量,ARC 下无法使用这个函数在指定位置创建类实例
id objc_constructInstance ( Class cls, void *bytes );
销毁类实例
void * objc_destructInstance ( id obj );
返回指定对象的拷贝
id object_copy ( id obj, size_t size );
释放指定对象占用的内存
id object_dispose ( id obj );
改变类实例的实例变量的值
Ivar object_setInstanceVariable ( id obj, const char *name, void *value );
获取实例变量的值
Ivar object_getInstanceVariable ( id obj, const char *name, void **outValue );
获取指向给定对象分配的任何额外字节的指针
void * object_getIndexedIvars ( id obj );
获取对象中实例变量的值
id object_getIvar ( id obj, Ivar ivar );
设置对象中实例变量的值
void object_setIvar ( id obj, Ivar ivar, id value );
上面的函数,有些功能相似,函数名短的指定速度快
获取给定对象的类名
const char * object_getClassName ( id obj );
获取对象的类
Class object_getClass ( id obj );
设置对象的类
Class object_setClass ( id obj, Class cls );
Runtime 会自动注册我们代码中定义的所有类,也可以通过 objc_addClass
函数注册
获取已注册的类定义的列表
int objc_getClassList ( Class *buffer, int bufferCount );
buffer
获取到的是列表,最后需要我们手动释放所占内存空间创建并返回一个指向所有已注册类的指针列表
Class * objc_copyClassList ( unsigned int *outCount );
返回指定类的定义
Class objc_lookUpClass ( const char *name );
Class objc_getClass ( const char *name );
Class objc_getRequiredClass ( const char *name );
nil
nil
获取指定类的元类
Class objc_getMetaClass ( const char *name );
nil