runtime基本用法

2019-02-19  本文已影响0人  富城

先导入 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);
}
上一篇 下一篇

猜你喜欢

热点阅读