美文网首页
Runtime使用小结

Runtime使用小结

作者: 木子尚武 | 来源:发表于2016-06-07 19:52 被阅读13次

OC方法的本质:

Runtime技术的使用基于OC是一门动态语言,那么何为动态语言呢?动态语言意味着变量类型的确认以及方法的实现由编译期推后到了运行期(这也就是为什么我们运行iOS APP有时会报错unrecognized selector错误)。

runtime常用的技术点:

  • 方法交换
  • 方法添加
  • 操作属性
   // 消息机制
  Person *p = objc_msgSend([Person class], @selector(alloc));
  p = objc_msgSend(p, @selector(init));
  objc_msgSend(p, @selector(run:),20);
// 交换方法
+ (void)load{

    Method imageNamed = class_getClassMethod(self, @selector(imageNamed:));
    Method lsw_imageNamed = class_getClassMethod(self, @selector(lsw_imageNamed:));
    method_exchangeImplementations(imageNamed, lsw_imageNamed);
}

+ (UIImage *)lsw_imageNamed:(NSString *)name{
   
    UIImage *image = [UIImage lsw_imageNamed:name];
    if (image == nil) {
        NSLog(@"无法加载图片");
    }
    
    return image;
}
  // 动态添加方法
 // 什么时候调用:只要调用没有实现的方法 就会调用方法去解决
 // 作用:去解决没有实现方法,动态添加方法
+ (BOOL)resolveInstanceMethod:(SEL)sel{
   
   /*
       class:目标类
       SEL:方法编号
       IMP:方法实现
       type:方法类型
    */
   
   // [NSStringFromSelector(sel) isEqualToString:@"eat"];
   if (sel == @selector(run:)) {
       // 添加方法
       class_addMethod(self, sel, (IMP)run, nil);
       
       return YES;
   }
   
   return [super resolveInstanceMethod:sel];
}

 // 动态调用方法
 [p performSelector:@selector(run:) withObject:@20];
   // 自定义对象归档应用
- (void)encodeWithCoder:(NSCoder *)aCoder{
   
   unsigned int count = 0;
   Ivar *ivarList = class_copyIvarList(Person.class, &count);
   for (int i=0; i<count; i++) {
       
       Ivar ivar = ivarList[i];
       NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
       [aCoder encodeObject:[self valueForKey:key] forKey:key];
   }
   
   free(ivarList);
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
   
   self = [super init];
   if (self) {
       
       unsigned int count = 0;
       Ivar *ivarList = class_copyIvarList(Person.class, &count);
       for (int i=0; i<count; i++) {
           
           Ivar ivar = ivarList[i];
           NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
           id value = [aDecoder decodeObjectForKey:key];
           [self setValue:value forKey:key];
       }
       
       free(ivarList);
   }
   return self;
}
   // 动态添加带有参数的方法
   // self和_cmd是两个隐藏的参数 
  void eat(id self,SEL _cmd,id objc){
    
    NSLog(@"在这里吃了:%@",objc);
  }

代码下载:
https://github.com/lswfly123/Message

相关文章

  • Runtime使用小结

    OC方法的本质: Runtime技术的使用基于OC是一门动态语言,那么何为动态语言呢?动态语言意味着变量类型的确认...

  • Runtime小结

    一、runtime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...

  • runtime 小结

    isa是一个objc_class类型的指针.根据上面内存布局以一个objc_class指针为开始的所有都可以当做一...

  • Runtime小结

    在runtime中一个对象就是用结构体来表示的 runtime中的表示 获取类的属性列表 获取类的成员变量 获取类...

  • Runtime小结

    一、Runtime简介RunTime简称运行时,是一套底层的 C 语言 API。Objective-C是一门动态编...

  • runtime 小结

    OC被称之为动态运行时语言,最主要的原因就是因为两个特性,一个是运行时也就是runtime,一个是多态。 runt...

  • iOS 开发之runtime使用小结

    我们一般用runtime做以下这些事情: 一、使用runtime如何交换两个方法的实现,拦截系统自带的方法调用功能...

  • Runtime

    Runtime:运行时使用Runtime就是使用苹果提供的API使用Runtime可以实现OC无法实现的:1.使用...

  • runtime的用法

    1.使用runtime改变变量值 2.使用runtime交换方法 3.使用runtime添加方法 4.使用runt...

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

网友评论

      本文标题:Runtime使用小结

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