消息接收者(receiver)---就是发给哪个对象。
消息选择器(selector)---标识一个消息,通过查找类结构或者必要时查找父类的结构,定位相应方法的可执行代码。
消息参数(arguments)---一旦找到方法的可执行代码,那么系统会简单将这些参数放在方法可执行代码所在的栈上,这个过程是一个标准的函数调用过程。
让我们看看如下的例子:
[taskArray insertObject: anObj atIndex: i];
上述代码中:消息接收者(receiver)是”taslArray”,消息选择器(selector)是” insertObject:atIndex:”, 消息参数(arguments)是"anObj" 和 "i"。注意,消息选择器(selector)包括参数标题和冒号,但是不包括参数名称。换句话说,方法声明为:'- (void) insertObject: (id)anObject atIndex: (unsigned)index;',但是其中"anObject" 和"index"仅仅是在方法实现的代码中才有效,在查找方法本身的时候并没有什么用。
在运行时,给对象发一个消息的时候,下面的事件会依次发生:
消息接收者(receiver)”taslArray”的isa指针开始查找这个类。
在类中查找符合消息选择器(selector)的方法,如果没有找到,就接着找”taskArray”对象类的父类,知道找到匹配的方法为止。
调用找到的这个方法,就像调用C语言中的函数一样,并将消息参数(arguments)发给这个方法,然后方法执行完,返回定义好的值给调用消息的代码或什么值都不返回。
事实上,当调用一个方法时,这个方法会收到两个额外的隐含参数,receiver 和selector。这两个额外的参数,在源码中表示为self和_cmd。
这种在运行时,查找接收消息对象的技术称为动态绑定(dynamic binding)。这种动态绑定技术使Objective-C语言更加强大和灵活,但是,不可避免地,动态绑定要比C语言中简单的函数调用要慢一些,虽然Objective-C使用了一些聪明的缓存机制,但还是会慢一些。当然,会有一些提供提高性能的方法,在讨论它们之前,先让我们继续掌握一些关于selector和方法实现的更多细节。
编程学习 Objective-C 高级消息机制 消息是如何工作的 转载请保留此行.谢谢.