美文网首页
关于runtime的一些简单理解

关于runtime的一些简单理解

作者: 我勒个去的 | 来源:发表于2016-06-21 10:31 被阅读25次

1.消息发送
OC:运行时机制,消息机制是运行时机制最重要的机制
消息机制:任何方法调用,本质都是发送消息

SEL:方法编号,根据方法编号就可以找到对应方法实现
Person *p = [[Person alloc] init];
[p performSelector:@selector(eat)];
// 让p发送消息
// objc_msgSend(p, @selector(eat));
// objc_msgSend(p, @selector(run:),10);带参数的消息
这是消息发送的对象方法。

// 获取类对象
Class personClass = [Person class];
[personClass performSelector:@selector(eat)];
// 运行时
objc_msgSend(personClass, @selector(eat));
这是消息发送的类方法。

2.方法交换
// 交换方法实现,方法都是定义在类里面
// class_getMethodImplementation:获取方法实现
// class_getInstanceMethod:获取对象
// class_getClassMethod:获取类方法
// IMP:方法实现

// Class:获取哪个类方法
// SEL:获取方法编号,根据SEL就能去对应的类找方法
Method imageNameMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));

// xmg_imageNamed
Method xmg_imageNamedMethod = class_getClassMethod([UIImage class], @selector(xmg_imageNamed:));

// 交换方法实现
method_exchangeImplementations(imageNameMethod, xmg_imageNamedMethod);

实列:

  • (UIImage *)xmg_imageNamed:(NSString *)imageName
    {
    // 1.加载图片
    UIImage *image = [UIImage xmg_imageNamed:imageName];

    // 2.判断功能
    if (image == nil) {
    NSLog(@"加载image为空");
    }

    return image;
    }
    这样就实现了两个方法的交换。

3.动态添加方法
// performSelector:动态添加方法,声明一个类,并不提供eat:这个方法
Person *p = [[Person alloc] init];
[p performSelector:@selector(eat:) withObject:@111];
在Person类中,
// 动态添加方法,首先实现这个resolveInstanceMethod
// resolveInstanceMethod调用:当调用了没有实现的方法没有实现就会调用resolveInstanceMethod
// resolveInstanceMethod作用:就知道哪些方法没有实现,从而动态添加方法
// sel:没有实现方法

  • (BOOL)resolveInstanceMethod:(SEL)sel
    {
    // NSLog(@"%@",NSStringFromSelector(sel));

    // 动态添加eat方法
    if (sel == @selector(eat:)) {

      /*
       cls:给哪个类添加方法
       SEL:添加方法的方法编号是什么
       IMP:方法实现,函数入口,函数名
       types:方法类型
       */
      // @:对象 :SEL
      class_addMethod(self, sel, (IMP)aaaa, "v@:@");
      // 处理完
      return YES;
    

    }
    return [super resolveInstanceMethod:sel];
    }

声明一个C语言的函数来动态添加
void aaaa(id self, SEL _cmd, id param1)
{
NSLog(@"调用eat %@ %@ %@",self,NSStringFromSelector(_cmd),param1);
}

4.分类动态添加属性
列如给NSObject添加一个name属性

  • (void)setName:(NSString *)name
    {
    // 添加属性,跟对象
    // 给某个对象产生关联,添加属性
    // object:给哪个对象添加属性
    // key:属性名,根据key去获取关联的对象 ,void * == id
    // value:关联的值
    // policy:策越
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    // _name = name;
    }

  • (NSString *)name
    {
    return objc_getAssociatedObject(self, @"name");
    }

相关文章

  • objective-C之runtime第一篇

    网上查看了一些runtime的资料, 关于runtime是什么?这里想用自己的理解,简单点说:runtime是一套...

  • 关于runtime的一些简单理解

    1.消息发送OC:运行时机制,消息机制是运行时机制最重要的机制消息机制:任何方法调用,本质都是发送消息 SEL:方...

  • 简单理解runtime

    runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型、C语言函数 平时我们编写的代码,底层都是...

  • 简单理解runtime

    runtime简称运行时机制,其中最主要的是消息机制,也是oc的一大特点。 对于c语言而言,在编译的时候就会去决定...

  • runtime的简单理解

    原文链接:http://blog.csdn.net/mumubumaopao/article/details/51...

  • 关于iOS Runtime让你了解更多

    关于Runtime Runtime根据字面理解就是运行时,当我们的代码运行的时候所体现的东西,举一个比较简单一点的...

  • 关于RunTime理解

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

  • iOS runtime笔记一

    参考资料 南峰子的runtime 一【OC刨根问底】Runtime简单粗暴理解 对象的理解,元类(meta cla...

  • 微点滴:对于OC的runtime运行时的一些理解

    runtime 的一些理解, 整理收集了不少网络的知识, 只是用于自己对runtime的理解,以备以后自己查阅...

  • iOS Runtime简单理解

    简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 O...

网友评论

      本文标题:关于runtime的一些简单理解

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