动态绑定

动态绑定:

传统的函数一般在编译时就已经把参数信息和函数实现打包到编译后的源码中了,而在OC中最常使用的是消息机制。调用一个实例的方法,所做的是向该实例的指针发送消息,实例在收到消息后,从自身的实现中寻找响应这条消息的方法。

动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。这里所指的属性和方法当然包括了原来没有在类中实现的,而是在运行时才需要的新加入的实现。在Cocoa层,我们一般向一个NSObject对象发送-respondsToSelector:或者-instancesRespondToSelector:等来确定对象是否可以对某个SEL做出响应,而在OC消息转发机制被触发之前,对应的类的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,在此时有机会动态地向类或者实例添加新的方法,也即类的实现是可以动态绑定的。

void dynamicMethodIMP(id self, SEL _cmd)
{
    // implementation ....
}

//该方法在OC消息转发生效前被调用

+ (BOOL) resolveInstanceMethod:(SEL)aSEL

{ if (aSEL == @selector(resolveThisMethodDynamically))

{

//向[self class]中新加入返回为void的实现,SEL名字为aSEL,实现的具体内容为dynamicMethodIMP

class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, “[email protected]:”);

return YES;

}

return [super resolveInstanceMethod:aSel];

}

当然也可以在任意需要的地方调用class_addMethod或者method_setImplementation(前者添加实现,后者替换实现),来完成动态绑定的需求。

动态绑定,布布扣,bubuko.com

时间: 2024-12-05 11:25:33

动态绑定的相关文章

java中的动态绑定与静态绑定

首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定   程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定   静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序

C/C++细节问题(bug调试)以动态绑定代码来示例

在程序界,有句话是,程序好些,bug难调. 很多bug并不一点是逻辑错误,而是一些细节问题. 我们分析下三个细节错误引起的无法运行问题: //#define M_PI 3. 14159265358979323846      3.14中间有个空格 \t        写成了\ t       有个空格 首先,创建了一个新类型CFigure.我们想创建一些具体的图形(如,三角形.正方形或者圆),以及计算这些图形周长和面积的方法.但是,我们并不知道具体的图形是什么类型,所以无法用方法直接计算图形的这

有关于多态和静态绑定与动态绑定的知识

一.多态 事物出现的多种体现形态(Java中指同一对象可以有不同类型的指向.) 1.多态的体现: 父类的引用指向了自己的子类的(或孙类)的对象. 父类的引用也可以接受自己的子类对象. 2.多态的前提: 1).必须是类与类之间有关系,要么继承.要么实现. 2).存在继承.  存在方法重写.   存在父类引用指向子类对象. 3.多态的好处: 提高了代码的复用性. 4.多态的弊端: 但是只能是父类的引用指向父类的成员. 5.多态的应用: 6.多态的代码特点(代码的注意事项) 1).多态中成员函数的特点

从stackoverflow上的一个问题看Java动态绑定

我们先来看stackoverflow上的一个问题,先上代码 1 public class Piece{ 2 public static void main (String [] args){ 3 Piece p2 = new Knight(); 4 Knight p1 = new Knight(); 5 p1.capture(p2); 6 p2.capture(p1); 7 } 8 public void capture(){ 9 System.out.println("Capture"

Java动态绑定机制的内幕解惑

在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding)和动态绑定机制(auto binding). ★ 静态绑定机制 Java代码   //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println("Father- f1()"); } } //调用静态方法 impor

关于c++继承,动态绑定的注意点

1.任何构造函数之外的非静态函数都可以是虚函数,virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义,如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数. 2.派生类能访问基类的public,protected成员,而不能访问私有成员. 3.如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他的普通成员,派生类会直接继承其在基类中的版本. 4.派生类必须使用基类的构造函数来初始化它的基类成员,通过构造函数初始化列表来将实参传递给基类构造函数. 5.

工作积累(八)——AngularJS与单选框及多选框的双向动态绑定

AngularJS 在 <input type="text" /> 中实现双向动态绑定十分简单,如下所示: <input type="text" ng-model="topic.title" /> 只需要用ng-model 与 $scope 中的属性对应,即实现了type="text" 的双向动态绑定.当 <input type="radio" /> 及 <inpu

AngularJS单选框及多选框实现双向动态绑定

在AngularJS中提及双向数据绑定,大家肯定会想到ng-model指令. 一.ng-model ng-model指令用来将input.select.textarea或自定义表单控件同包含它们的作用域中的属性进行绑定.它将当前作用域中运算表达式的值同给定的元素进行绑定.如果属性不存在,它会隐式创建并将其添加到当前作用域中. 始终用ng-model来绑定scope上一个数据模型内的属性,而不是scope上的属性,这可以避免在作用域或后代作用域中发生属性覆盖! <input type="te

HighChat 动态绑定数据记录

最近刚开始做图形操作,纠结了一上午,highchat 动态绑定数据这块一直不知道怎么绑定,后来多次尝试,发现 1.x轴的数据是个数组格式,我从后台传到前台的时候,js中用数组进行处理数据,然后赋值到chat就不会报错, 2.y轴的数据和x轴数据还不一样,通过数组处理后发现还是无法显示.后来我在后台将数据添加了中括号[]括起来后,传到前台,然后前台在用eval()处理后就能够显示了 3.eval具有计算的功能,刚开始x轴的时候我用了eval对时间进行操作发现时间都是相减了,格式为:2017-07-

Java的动态绑定机制

Java的动态绑定又称为运行时绑定.意思就是说,程序会在运行的时候自动选择调用哪儿个方法. 一.动态绑定的过程: 例子: public class Son extends Father Son son = new Son(); son.method(); 1. 首先,编译器根据对象的声明类型和方法名,搜索相应类(Son)及其父类(Father)的"方法表",找出所有访问属性为public的method方法. 可能存在多个方法名为method的方法,只是参数类型或数量不同. 2. 然后,