Runtime — 运行时机制

  • Runtime是一套底层的C语言API(包含强大的C语言数据类型和函数)
  • OC代码都是基于Runtime实现的,即编写的OC代码最终都会转成Runtime的代码,例如:
    HCPerson *person = [HCPerson alloc] init];
    [person setAge:10]; //这句会转换成objc_msgSend(person,@selector(setAge:),20);
    

Runtime的作用

  • 获取类的私有变量
     #import <objc/runtime.h>
      // Ivar : 成员变量
      unsigned int count = 0;
      // 获得所有的成员变量
      Ivar *ivars = class_copyIvarList([HCPerson class], &count);
      for (int i = 0; i<count; i++) {
          // 取得i位置的成员变量
          Ivar ivar = ivars[i];
          const char *name = ivar_getName(ivar);
          const char *type = ivar_getTypeEncoding(ivar);
          NSLog(@"%d %s %s", i, name, type);
    
      }
    
  • 动态产生类,成员变量和方法
  • 动态修改类,成员变量和方法
  • 对换两个方法的实现(swizzle)
    • 例如:如果想要对iOS7以上和iOS7以下的图片进行适配,不同系统版本显示不同的图片,则可利用swizzle来实现
  • 实现方法:
    1.自定义UIImage的类imageWithName:方法,在该方法内进行系统版本号的判断,来显示不同的图片
    2.将imageWithName:方法和系统的imageNamed:方法进行对换,这样,一旦调用系统的imageNamed:方法,便会执行自定义的imageWithName:方法,进行判断,显示不同的图片
    /**
     *  只要分类被装载到内存中,就会调用1次
     */
    + (void)load
    {
        //获取类方法
        Method otherMehtod = class_getClassMethod(self, @selector(imageWithName:));
        Method originMehtod = class_getClassMethod(self, @selector(imageNamed:));
        // 交换2个方法的实现
        method_exchangeImplementations(otherMehtod, originMehtod);
    }

    + (UIImage *)imageWithName:(NSString *)name
    {
        BOOL iOS7 = [[UIDevice currentDevice].systemVersion floatValue] >= 7.0;
        UIImage *image = nil;
        if (iOS7) {
            NSString *newName = [name stringByAppendingString:@"_os7"];
            image = [UIImage imageWithName:newName];
        }

        if (image == nil) {
            image = [UIImage imageWithName:name];
        }
        return image;
    }

        ```
posted @ 2015-09-08 12:51  冲破茧缚  阅读(178)  评论(0编辑  收藏  举报