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, "[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 动态消息机制

原文地址:https://www.cnblogs.com/chinatrump/p/11601738.html

时间: 2024-08-10 18:27:06

RunTime 动态消息机制的相关文章

iOS开发runtime学习:一:runtime简介与runtime的消息机制

一:runtime简介:也是面试必须会回答的部分 二:runtime的消息机制 #import "ViewController.h" #import <objc/message.h> #import "Person.h" /* 总结: 1: runtime:必须要导入头文件 <objc/message.h>,此头文件中已经引入了<objc/runtime.h> 任何方法调用本质:发送一个消息,用runtime发送消息.OC底层实现

runtime总结二之消息机制(包括消息转发,消息交换的黑魔法)

runtime的消息机制 前面提到过编译器最终会把我们的消息发送转化为函数调用 消息发送 [object sendMassage] 首先编译器会在运行时将上面的例子转化为objc_msgSend(obj,@selector(sendMassage))这个函数,转换的时候除了方法本身的参数之外,还有两个隐藏的参数一个是id类型的,代表对象的类型,还是一个是SEL类型的,是函数对应的方法的编号,接下来就会按照下面的流程来调用这个方法 通过obj的isa指针找到其所对应的类. 通过SEL先去类的cac

Objective-C总Runtime的那点事儿(一)消息机制

Objective-C总Runtime的那点事儿(一)消息机制 RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送.属于动态调用过程.在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错.而C语言在编译阶段就会报错).只有在真正运行的时候才

Runtime那些事儿(消息机制)

一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtime黑魔法的强大,趁现在有机会分享一下对runtime的一些理解.在对象调用方法是Objective-C中经常使用的功能,也就是消息的传递,而Objective-C是C的超集,所以和C不同的是,Objective-C使用的是动态绑定,也就是runtime.Objective-C的消息传递和消息机制也就不多说了,今天主要说的是动态方法,也就是函数的调用. 二.相关的几个函数 下面一张图详

NSObject头文件解析 / 消息机制 / Runtime解读 (一)

NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface ClassA : NSObject @end 那么NSObject里面具体有什么呢? 我们点到它的头文件里面去看看 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; //每个NSObject对象都拥有一个Class类作为成员

Objective-C总Runtime的那点事儿(一)消息机制【转】

RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送.属于动态调用过程.在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错.而C语言在编译阶段就会报错).只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用. 那OC是怎么实现动态调

iOS:runtime消息机制

最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等.其他的问题如果有机会我会在其他文章中介绍.本篇文章主要介绍RunTime. RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送

Object-c runtime消息机制

RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送.属于动态调用过程.在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错.而C语言在编译阶段就会报错).只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用. 那OC是怎么实现动态调

ios学习路线—Objective-C(Runtime消息机制)

RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送.属于动态调用过程.在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错.而C语言在编译阶段就会报错).只有在真正运行的时候才会根据函数的名称找到对应的函数来调用. 那OC是怎么实现动态调用