加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

RunTime 动态消息机制

发布时间:2020-12-15 07:32:55 所属栏目:Java 来源:网络整理
导读:##什么是RunTime机制 oc在编译的时是不知道调用哪个函数,运行时找不到就报错 C语言在编译的时候就知道调用哪个方法 [p eat]消息机制 任何方法调用 本质都是发送消息[p performSelector:@selector(#selector#)] #import objc/message.h 倒入运行时框架运行时

##什么是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,"[email?protected]:");
    }
    }    +(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 动态消息机制

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读