iOS中runtime机制的理解与简单使用

2016-09-29  本文已影响0人  Vantine

1.对runtime的理解

2. runtime的使用

+ (UIImage *)customImageNamed:(NSString *)name {
                  doubleversion = [[UIDevicecurrentDevice].systemVersiondoubleValue];
                      if(version >=8.0) {
                             // 如果系统版本是8.0以上,使用另外一套文件名结尾是‘_os7’的扁平化图片
                             name = [name stringByAppendingString:@"_os7"];   
                       }
               return[UIImagecustomNamed:name];
}
    - b、分类中重写UIImage的load方法,实现方法的交换
+ (void) load {
                // 获取两个类的类方法
                Method m1 = class_getClassMethod([UIImageClass],@selector(imageNamed:));
                Method m2 = class_getClassMethod([UIImageClass],@selector(customImageNamed:));
                method_exchangeImplementations(m1, m2);
}
  >注意:自定义方法中最后一定要再调用一下系统的方法,让其有加载图片的功能,但是由于方法交换,系统的方法名已经变成了我们自定义的方法名(有点绕,就是用我们的名字能调用系统的方法,用系统的名字能调用我们的方法),这就实现了系统方法的拦截!
- (void) encodeWithCoder: (NSCoder *) encoder {
              unsigned int count = 0;
              Ivar *ivars = class_copyIvarList([Person class], &count);
              for (int i = 0; i < count; i++) {
                  // 取出i位置对应的成员变量
                  Ivar ivar = ivars[i];
                  // 查看成员变量
                  const char *name = ivar_getName(ivar);
                  // 归档
                  NSString *key = [NSString stringWithUTF8String:name];
                  id value = [self valueForKey:key];
                  [encoder encodeObject: value forKey:key];
              }
              free(ivars);
}
   -  用运行时的解归档方法
- (id) initWithCoder: (NSCoder *) decoder {
              if (self = [super init]) {
                  unsigned int count = 0;
                  Ivar *ivars = class_copyIvarList([Person class], &count);
                  for (int i = 0; i < count; i++) {
                        // 取出i位置对应的成员变量
                        Ivar ivar = ivars[i];
                        // 查看成员变量
                        const char *name = ivar_getName(ivar);
                        // 归档
                        NSString *key = [NSString stringWithUTF8String:name];
                        id value = [self valueForKey:key];
                        [encoder encodeObject: value forKey:key];
                   }
                  free(ivars);
              }
              return self;
}
上一篇 下一篇

猜你喜欢

热点阅读