在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,关于Blocks会在后续总结一下。 消息传递模型(Message Passing)是Objective-C语言的核心机制。在Objective-C中,没有方法调用这种说法,只有消息传递。
很显然,既然编译器不定位方法,那么只有运行期定位方法了,Objective-C又是怎么去运行期定位方位的呢? id objc_msgSend(id receiver, SEL selector, ...)【包含二个必要参数:receiver(接受者对象)、selector(方法选择器)和一个未知参数(selector的参数列表)】 Objective-C就是通过上述方法来查找调用方法的~比如[itNoob cry]就被转换成objc_msgSend(itNoob,cry),这里receiver就是itNoob对象,selector就是cry选择器,当然如果cry拥有参数的话,会同样被转换,如[itNoob cry:@"呜呜" AndSmile:@"嘻嘻"]会被转换成objc_msgSend(itNoob,cry:AndSmile:,@"呜呜",@"嘻嘻"),类似如objc_msgSend(id receiver, SEL selector, parm1,parm2,...)。 objc_msgSend的动态绑定过程
那objc_msgSend的是如何查找方法的具体实现位置呢,从网上找了一下,如下: 编译器构建每个类的时候,每个类必须包含二个必要的元素:
我们知道每个对象都有一个isa指针,指向所属类,通过这个isa指针可以找到对象的所属类和所属的父类... 查找过程如下: (图片来源网络) 当想一个对象发送消息的时候,先根据isa找到所属的类,然后去查找该类的dispatch table,如果没有找到,就去其父类中查找...如果找到了,就根据调度表中的内存地址调用该实现,如果最后一直没有找到返回nil。 转载请注明:IT搬砖少年中心 http://cnblogs.com/ItNoob
by zxzhao |
请发表评论