RunTime 动态消息机制

Posted petewell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RunTime 动态消息机制相关的知识,希望对你有一定的参考价值。

##什么是RunTime机制

  • oc在编译的时是不知道调用哪个函数,运行时找不到就报错
  • C语言在编译的时候就知道调用哪个方法

    [p eat]
    消息机制 任何方法调用 本质都是发送消息
    [p performSelector:@selector(<#selector#>)]
     #import <objc/message.h> 倒入运行时框架
    运行时发送消息 谁做事情就去调用谁 xcode5以后 不给底层的方法让开发者调用
    调用类方法 其实 就是变成一个类对象  本质 类名转换成类对象  
    
    • 分类没有父类
      重写系统自带的方法 扩展 有一点不好的地方就是 到处导入头文件 很臃肿
      (IMP方法的实现)

###利用runtime 交换方法的实现
+(void)load{
Method imageName = class_getClassMethod([UIImage class], @selector(imageNamed:));
method_exchangeImplementations(imageName, ttmIimge);
Method ttmIimge = class_getClassMethod([UIImage class], @selector(ttm_imagenamed:))
}

###动态添加方法

  • 性能上的优化 可以用到的时候再加载
  • 当一个方法没有实现 但是又调用了这个方法 就会调用resolveInstanceMethod这个方法

    +(BOOL)resolveInstanceMethod:(SEL)sel{

    if ([NSStringFromSelector(sel) isEqualToString:@"eat"]) {
        /**
         *  <#Description#>
         *
         *  @param cls#>   给那个类 description#>
         *  @param name#>  添加方法的编号 description#>
         *  @param imp#>   方法实现 入口 函数名 description#>
         *  @param types#> 方法类型 description#>
         *
         *  @return <#return value description#>
         */
    class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:");
    }
    }    +(BOOL)resolveClassMethod:(SEL)sel{}
    

###动态添加属性

  • 给对象产生一种关联 而不是真的增加代码区别于动态增加方法
  • 给nsobject 增加一个属性

    /**
        跟对象产生一个关联属性
     *
     *  @param object#> 要产生管理的属性 description#>
     *  @param key#>    属性名字 description#>
     *  @param value#>  属性的值 description#>
     *  @param policy#> 策略 就是 strong之类的 description#>
     *
     *  @return
     */
    objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
    objc_getAssociatedObject(<#id object#>, <#const void *key#>)
    

原文:大专栏  RunTime 动态消息机制


以上是关于RunTime 动态消息机制的主要内容,如果未能解决你的问题,请参考以下文章

RunTime 方法交换 NSURL 空值处理

IOS-Runtime(消息机制)

ios-Runtime机制

iOS面试粮食Runtime—消息传递和转发机制Method Swizzling

iOS面试粮食Runtime—消息传递和转发机制Method Swizzling

RunTime