Notes

类与对象的操作函数

Runtime 提供大量的函数,用来操作类与对象,其中

操作类的函数

类名

获取类名

const char * class_getName( Class cls );

父类与元类

获取父类

Class class_getSuperclass(Class cls);

判断给定的类是否为元类

BOOL class_isMetaClass(Class cls);

获取实例大小

size_t class_getInstanceSize(class cls);

操作成员变量及属性


获取类中指定的 实例成员变量 的信息,通过名称指定

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 );

获取指定属性

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_classmethodLists 的操作

添加方法

BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types );

获取实例方法

Method class_getInstanceMethod ( Class cls, SEL name );

获取类方法

Method class_getClassMethod ( Class cls, SEL name );

获取所有实例方法,包装在一个数组中

Method * class_copyMethodList ( Class cls, unsigned int *outCount );

替换方法的实现

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 );

操作协议

添加协议

BOOL class_addProtocol ( Class cls, Protocol *protocol );

判断类是否实现指定协议

BOOL class_conformsToProtocol ( Class cls, Protocol *protocol );

获取类实现的协议列表

Protocol * class_copyProtocolList ( Class cls, unsigned int *outCount );

动态创建类

创建一个新类或元类

Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes );

动态创建类的步骤

  1. 调用 objc_allocateClassPair 创建类
  2. 调用 class_addMethod, class_addIvar 添加方法和实例变量或属性
  3. 调用 objc_registerClassPair 注册类
  4. 之后就可以使用类了

注册类

void objc_registerClassPair ( Class cls );

销毁一个类,及其相关的类

void objc_disposeClassPair ( Class cls );

动态创建对象

创建类实例

id class_createInstance ( Class cls, size_t extraBytes );

在指定位置创建类实例

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 );

创建并返回一个指向所有已注册类的指针列表

Class * objc_copyClassList ( unsigned int *outCount );

返回指定类的定义

Class objc_lookUpClass ( const char *name );
Class objc_getClass ( const char *name );
Class objc_getRequiredClass ( const char *name );
  1. 类在运行时未注册,返回 nil
  2. 类在运行时未注册,调用类处理回调,再次确认类是否注册,再未注册,返回 nil
  3. 类在运行时未注册,杀死进程

获取指定类的元类

Class objc_getMetaClass ( const char *name );