OC消息机制,消息转发机制

Runtime简称运行时,其中最主要的是消息机制

概述 C 与 OC 的不同

1.C 语言,函数的调用在编译的时候就会决定调用哪个函数(C语言的函数调用),编译完成之后直接顺序执行,无任何二义特性.

2.OC函数的调用成为消息发送,属于动态调用的过程,在编译的时候并不能决定真正调用哪个函数(其实的过程是,在编译阶段,OC可以调用任何函数,即使这个函数并未实现呢,只要申明过就不会报错,而C语言在编译阶段就会报错),只有在真正运行的时候才会根据函数的名称找到对应的函数来调用

3.简述内部实现的过程

1>首先,在编译器将代码[obi makeText] -> 转换成objc_msgSend(obj,@selector(makeText));

2>在objc-msgSend函数中,首先通过obj的isa指针找到obj对应的class,在Classe中先去cache中通过SEL查找对应函数method(猜测cache中method列表是以SEL为key,通过hash表示存储的,这样能提高函数查找速度)

3>若在cache中未找到,再去methodList中查找,若在methodList中未找到,则取superClass中查找,若能找到,则将method加入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中去执行


二.消息转发(可以间接实现多重继承)

注意:当向someObject发送消息的时候,runtime System在当前类和父类中找不到对应方法的实现

时,runtime system并不会立即报错使程序崩溃,而是一次执行

会执行下面的顺序

在本类及父类中找不到方法

1>动态方法解析:向当前类发送resloveInstanceMethod:信号,检查是否动态向该类添加了方法

2>快速消息转发:当前面没有实现的时候,检查该类是否实现了forwardingTargeetForSelector:方法:若实现了则调用这个方法,若该方法返回值对象非nil或非Self,则该返回对象重新发送消息

- (id)forwardingTargetForSelector:(SEL)aSelector

{

�class*other = [classnew];if([other forwardingTargetForSelector:aSelector]) {returnother;

}else{return[super forwardingTargetForSelector:aSelector];

}

}

3>标准信息转发:runTime发送methodSignatureForSelector:消息获取Selector对应的方法签名,返回值非空则通过forwardInvocation:转发消息,返回值为空则向当前对象发送doesNotRecongizeSelector:消息,程序崩溃退出




你可能感兴趣的:(OC消息机制,消息转发机制)