注: 此篇中记录的是以class开头的runtime函数
一、创建对象
创建一个对象
|
|
cls: 类型
extraBytes: 分配的内存大小
返回值: cls类型的实例对象
例子:
12size_t size = class_getInstanceSize([Person class]);Person *person = class_createInstance([Person class], size);
二、类名、父类、实例变量、成员变量、属性、实例方法、类方法、方法实现
获取指定类的类名 (char *类型字符串)
|
|
获取指定类的父类型 (Class类型)
|
|
获取一个指定类型的实例占用内存大小 (size_t 类型)
|
|
获取一个类中, 指定名称的实例成员变量的信息
|
|
cls: 类型
name: 成员变量名(属性带 “_”)
返回值: 成员变量信息
例子:
1Ivar ivar = class_getInstanceVariable([self class], "_person")
获取属性的信息, 不用打_
|
|
获取对象方法信息 ( “-“ 方法)
|
|
cls: 类
name: 方法
返回值: 对象方法信息 - * ### Method类型
例子:
1Method method = class_getInstanceMethod([self class], @selector(methodName));
获取类方法的信息 ( “+” 方法 )
|
|
cls: 类
name: 方法
返回值: 对象方法信息 - ### Method类型
例子:
1Method method = class_getInstanceMethod([self class], @selector(methodName));
获取方法的具体实现 (IMP)
|
|
cls: 类
name: 方法
返回值: 方法的具体实现 ### IMP类型
例子:
1IMP imp = class_getMethodImplementation([self class], @selector(methodName));
获取方法的具体实现, 返回值类型为struct
|
|
cls: 类
name: 方法
返回值: 方法的具体实现 ### struct IMP类型
例子:
1IMP imp = class_getMethodImplementation_stret([self class], @selector(methodName));
三、成员变量列表、属性列表、方法列表、协议列表
获取成员变量列表
|
|
cls: 类
*outCount: 无符号整形变量的指针, 用于获取成员变量数量
返回值: 成员变量列表
例子:
123456789unsigned int count;Ivar *ivarList = class_copyIvarList([self class], &count);for (int i = 0; i < count; i++) {Ivar ivar = ivarList[i];// 获取成员属性名NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];NSLog(@"%@%@", type, name);}
获取属性列表
|
|
cls: 类型
*outCount: 无符号整形变量的指针, 用于获取属性数量
返回值: 属性列表
例子:
123456789unsigned int count;objc_property_t *propertyList = class_copyPropertyList([self class], &count);for (int i = 0; i < count; i++) {objc_property_t property = propertyList[i];// 获取成员属性名NSString *name = [NSString stringWithUTF8String:property_getName(property)];NSString *type = [NSString stringWithUTF8String:property_getAttributes(property)];NSLog(@"%@%@", type, name);}
获取方法列表
|
|
cls: 类
*outCount: 无符号整形变量的指针, 用于获取方法数量
返回值: 方法列表
例子:
123456unsigned int count;Method *methodList = class_copyMethodList([self class], &count);for (int i = 0; i < count; i++) {Method method = methodList[i];NSLog(@"%s%s", __func__, sel_getName(method_getName(method)));}
获取协议列表
|
|
cls: 类
*outCount: 无符号整形变量的指针, 用于获取协议数量
返回值: 协议列表
例子:
123456unsigned int count;Protocol *protocolList = class_copyProtocolList(class,&count);for (int i = 0; i < count; i++) {Protocol *protocol = protocolList[i];NSLog(@"%s%s", __func__, [self protocol_getName:protocol]);}
四、add: 成员变量、属性、方法、协议
添加成员变量(添加成员变量只能在运行时创建的类,且不能为元类)
|
|
cls: 类
name: 成员变量名
size: 大小
alignment: 对齐方式
types: 参数类型
返回值: YES: 添加成功 NO: 添加失败
例子:
12345if (class_addIvar([Person class], "country", sizeof(NSString *), 0, "@")) {NSLog(@"%sadd ivar success", __func__);}else{NSLog(@"%sadd ivar fail", __func__);}
添加属性
|
|
cls: 类
name: 属性名
attributes: 参数
attributeCount: 参数数量
返回值: YES: 添加成功 NO: 添加失败
例子:
12345678910objc_property_attribute_t type = { "T", "@\"NSString\"" };objc_property_attribute_t ownership = { "&", "N" }; // C = copyobjc_property_attribute_t backingivar = { "V", "" };objc_property_attribute_t attrs[] = { type, ownership, backingivar };if (class_addProperty([_person class], "country", attrs, 3)) {NSLog(@"%sadd Property success", __func__);}else{NSLog(@"%sadd Property fail", __func__);}
添加方法
|
|
cls: 类型
name: 方法
imp: 方法实现
types: 类型
返回值: YES: 添加成功 NO: 添加失败
例子:
12345if (class_addMethod([self class], NSSelectorFromString(@"runtimeTestMethod:"), class_getMethodImplementation([self class], NSSelectorFromString(@"runtimeTestMethod:")), "v@:@")) {NSLog(@"%sadd method success", __func__);}else{NSLog(@"%sadd method fail", __func__);}
添加协议
|
|
cls: 类
protocol: 协议
返回值: YES: 添加成功 NO: 添加失败
例子:
12345if (class_addProtocol([_person class], @protocol(RuntimeBaseProtocol))) {NSLog(@"%sadd protocol success", __func__);}else{NSLog(@"%sadd protocol fail", __func__);}
五、replace: 属性、方法
替换属性的信息(如果没有原属性会新建一个属性)
|
|
cls: 类
name: 属性名
attributes: 类型
attributeCount: 类型数量
无返回值
例子:
123456objc_property_attribute_t type = { "T", "@\"NSString\"" };objc_property_attribute_t ownership = { "C", "" }; // C = copyobjc_property_attribute_t backingivar = { "V", "" };objc_property_attribute_t attrs[] = { type, ownership, backingivar };class_replaceProperty([_person class], "country", attrs, 3);
替代方法的实现
|
|
cls: 类
name: 被替代的方法
imp: 替代方法
types: 类型
返回值: IMP
例子:
1class_replaceMethod([_person class], @selector(method1), class_getMethodImplementation([_person class], @selector(method2)), "v@:");
六、Class 判断
判断类是否有实现指定方法
|
|
cls: 类
sel: 方法
返回值: YES: 已经实现 NO: 没有实现
例子:
12345if (class_respondsToSelector([_person class], @selector(methodName))) {NSLog(@"%s %@ exist", __func__, NSStringFromClass(class));}else{NSLog(@"%s %@ non-exist", __func__, NSStringFromClass(class));}
查看类是否为元类
|
|
cls: 类
返回值: YES: 是元类 NO: 不是元类
例子:
12345if (class_isMetaClass(class)) {NSLog(@"%s %@ isMetaClass", __func__, NSStringFromClass(class));}else{NSLog(@"%s %@ non-isMetaClass", __func__, NSStringFromClass(class));}
查看类是否遵循指定协议
|
|
cls: 类
protocol: 协议
返回值: YES: 已经遵循指定协议 NO: 没有遵循指定协议
例子:
1234567if (class_conformsToProtocol([Person class], NSProtocolFromString(@"RuntimeBaseProtocol"))) {NSLog(@"%s %@ conformsToProtocol %@", __func__, NSStringFromClass(class), NSStringFromProtocol(protocol));return YES;}else{NSLog(@"%s %@ non-conformsToProtocol %@", __func__, NSStringFromClass(class), NSStringFromProtocol(protocol));return NO;}