博客> Objective-C Runtime 总结(一)
Objective-C Runtime 总结(一)
2019-12-11 21:58 评论:0 阅读:749 kyloMooa
ios runtime

第一篇 Classes操作

1. class_getName

作用

获取类名

声明

const char * class_getName(Class cls);

参数

cls

class对象

返回值

返回class名 或者 空字符串 (当cls为Nil时)

2. class_getSuperclass

作用

获取父类

声明

Class class_getSuperclass(Class cls);

参数

cls

class对象

返回值

返回当前class的superclass 或者 Nil(当cls是root class 或者 cls为Nil时)

建议

使用NSObject superclass方法替代它

3. class_setSuperclass

作用

设置父类

声明

Class class_setSuperclass(Class cls, Class newSuper);

参数

cls

被设置的类

newSuper

父类

返回值

cls的旧父类

建议

最好不使用它

4. class_isMetaClass

作用

判断一个类是否是元类参考

声明

BOOL class_isMetaClass(Class cls);

参数

cls

class类

返回值

YES 或NO (当cls不是元类 或者 cls为Nil时)

5. class_getInstanceSize

作用

获取类实例的大小参考

声明

size_t class_getInstanceSize(Class cls);

参数

cls

class类

返回值

类实例的大小 或者0(当cls为Nil时)

6. class_getInstanceVariable

作用

获取实例变量

声明

Ivar class_getInstanceVariable(Class cls, const char *name);

参数

cls

class类

name

_实例变量名

返回值

变量名name对应的Ivar指针

使用方式

[self class_getInstanceVariable:[self class] name:"_person"];

7. class_getInstanceVariable

作用

获取类变量

声明

Ivar class_getClassVariable(Class cls, const char *name);

参数

cls

class类

name

变量名

返回值

变量名name对应的Ivar指针

使用方式

[self class_getInstanceVariable:[self class] name:"Person"];

8. class_addIvar

作用

给类新增实例变量

声明

BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types);

参数

cls

class类

name

变量名

size

实例变量大小

alignment

数据对齐方式

types

变量类型参考

返回值

YES 或 NO(假如类已经包含实例变量name)

建议

不支持给一个已存在的class新增一个实例变量。此方法只会在 objc_allocateClassPair之后 和 objc_registerClassPair之前调用,并且,新增的class不能是元类,否则不支持。

使用方式

[self class_addIvar:[self class] name:"person" size:sizeof(NSString *) alignment:0 types:@encode(NSString *)];

9. class_copyIvarList

作用

返回由类声明的实例变量

声明

Ivar _Nonnull * class_copyIvarList(Class cls, unsigned int *outCount);

参数

cls

class类

outCount

变量个数(如果outCount传入NULL,则不返回变量个数)

返回值

返回class的变量数组头(指针Ivar *),但不包括父类的实例变量。假如class不存在变量,则返回值为NULL,同时*outCount为0。执行完后必须free()指针。

10. class_getIvarLayout

作用

返回类的变量strong修饰符布局参考

声明

const uint8_t * class_getIvarLayout(Class cls);

参数

cls

class类

返回值

返回类中变量strong修饰符布局

11. class_getIvarLayout

作用

设置类的变量strong修饰符参考

声明

void class_setIvarLayout(Class cls, const uint8_t *layout);

参数

cls

class类

返回值

设置类的变量strong修饰符

12. class_getWeakIvarLayout

作用

返回类的变量weak修饰符布局参考

声明

const uint8_t * class_getWeakIvarLayout(Class cls);

参数

cls

class类

返回值

返回类中变量weak修饰符布局

13. class_setWeakIvarLayout

作用

设置类的变量weak修饰符参考

声明

void class_setWeakIvarLayout(Class cls, const uint8_t *layout);

参数

cls

class类

返回值

设置类的变量weak修饰符

14. class_getProperty

作用

返回一个实例变量的property。(用法与class_getInstanceVariable相似)

声明

objc_property_t class_getProperty(Class cls, const char *name);

参数

cls

class类

name

实例变量名

返回值

返回一个objc_property_t 或者 NULL(当cls为Nil或者name不存在)

15. class_copyPropertyList

作用

返回类的实例变量的property

声明

objc_property_t _Nonnull * class_copyPropertyList(Class cls, unsigned int *outCount);

参数

cls

class类

outCount

变量个数(如果outCount传入NULL,则不返回变量个数)

返回值

返回一个指针类型 objc_property_t*,但不包括父类的实例变量。假如class不存在变量,则返回值为NULL,同时*outCount为0。执行完后必须free()指针。

16. class_addMethod

作用

给类增加方法

声明

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

参数

cls

class类

name

新增方法名

imp

函数指针参考

types

参数类型

返回值

YES 或者NO (当方法已经存在)

建议

新增的方法会覆盖掉父类的同名方法,却不会覆盖掉本类的同名方法,如果需要覆盖掉本类的同名方法,请使用method_setImplementation。新增方法必须有两个参数self和_cmd

用法

class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:");

收藏
0
sina weixin mail 回到顶部