美文网首页
runtime基本用法

runtime基本用法

作者: 富城 | 来源:发表于2019-02-19 14:04 被阅读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);
    }
    

    相关文章

      网友评论

          本文标题:runtime基本用法

          本文链接:https://www.haomeiwen.com/subject/vxexyqtx.html