先导入 runtime 头文件。
1、用 runtime 改变变量值;
// 实例变量的个数
unsigned int count = 0;
// 获取类中的所有实例变量
Ivar *ivar = class_copyIvarList(self.person class], &count);
// 遍历
for (int i = 0; i< count; i ++) {
// 实例变量
Ivar var = ivar[i];
const char *varName = ivar_getName(var);
// 转化一下
NSString *name = [NSString stringWithUTF8String:varName];
if([name isEqualToString = @"_name"]) {
object_setIvar(self.person, var, @"Jerry");
break;
}
}
2、使用 runtime 交换方法;
Method m1 = class_getInstanceMethod([self.person class], @selector(firstMethod));
Method m2 = class_getInstanceMethod([self.person class], @selector(secondMethod));
// 交换
method_exchangeImplementations(m1, m2);
3、使用 runtime 添加方法;
// "v@:@" : v表示 void,@表示 id,: 表示 SEL
class_addMethod([self.person class], @selector(run:), (IMP)runMethod, "v@:@");
void runMethod(id self, SEL _cmd, NSString *miles) {
}
4、使用 runtime 给分类扩展属性。
const char *name = "nick";
- (void)setNick:(NSString *)nick {
objc_setAssociatedObject(self, &name, nick, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *) nick {
return objc_setAssociatedObject(self, &name);
}
网友评论