使用隐藏的参数
当objc_msgSend
找到方法对应的实现时,它将直接调用该方法实现,并将消息中所有的参数都传递给方法实现,同时,它还将传递两个隐藏的参数:
这些参数帮助方法实现获得了消息表达式的信息。它们被认为是”隐藏“的是因为它们并没有在定义方法的源代码中声明,而是在代码编译时是插入方法的实现中的。
尽管这些参数没有被显示声明,但在源代码中仍然可以引用它们(就象可以引用消息接收者对象的实例变量一样)。在方法中可以通过self
来引用消息接收者对象,通过选标_cmd
来引用方法本身。在下面的例子中,_cmd
指的是strange
方法,self
指的收到strange
消息的对象。
- strange |
{ |
id target = getTheReceiver(); |
SEL method = getTheMethod(); |
if ( target == self || method == _cmd ) |
return nil; |
return [target performSelector:method]; |
} |
在这两个参数中,self
更有用一些。实际上,它是在方法实现中访问消息接收者对象的实例变量的途径。