[Objective-C]消息机制工作原理

来源:互联网 发布:php zrem 编辑:程序博客网 时间:2024/04/30 15:24

一个类就像C语言中的结构体。NSObject类声明了一个成员变量isa,因为NSObject类是整个继承树的根,每个类中都有一个isa指针指向所创建的对象(见图1-1)。类结构包括成员变量的名字和类型,以及类中方法的实现。每个类都有一个指针指向它的父类。

每个类都有一个指向自己的类的指针
图1-1 每个类都有一个指向自己的类的指针

类中的方法通过选择权(selector)索引,选择器是SEL类型,尽管SEL类型可定义为char*,不过,把它想象成一个int类型可能更有用些。类中每个方法的名字映射成一个唯一的int值,例如,方法addObject:可能映射成整数12。当查找类中方法时,可使用选择器,而不是使用字符串@”addObject:”。

作为Objective-C数据结构的一部分,存在这样一个表,它将方法的名字映射到它们的选择器内。图1-2示例
这里写图片描述
图1-2 选择器表

在编译时,只要有消息产生编译器就查找选择器类来寻找方法,因此,代码
[myObject addObject:yourObject];
变成了(假设选择器中,addObject:的值是12)如下形式:
objc_msgSend(myObject,12,youeObject);
这里,objc_msgSend()函数使用myObject类的isa指针来获得它的类结构,并查找与值12相关联的函数。假如没有找到函数,可追踪该指针至父类。假如父类中也没有对应的函数,则继续搜索继承树。假如到达树的顶端仍然没有发现,则抛出一个异常。

很明显,Cocoa中有一套处理消息的动态方法,这些类结构可在程序运行时改变。更特别的是,使用NSBundle类使得在程序运行时增加新类和函数相对容易。这是一个非常强大的技术,已经被其他开发者用于创建可扩展的应用程序。

0 0
原创粉丝点击