Objective-C 消息发送机制详解
1. 类方法与消息参数
在 Objective-C 中,类方法会将所有消息参数作为自动变量接收,其中包括接收者和选择器。 self 变量存储着指向接收者的指针,而 _cmd 变量则包含消息选择器。不过, _cmd 变量通常没那么受关注,因为它始终是该方法的选择器。
2. 消息编译
Objective-C 编译器会将每个方法调用转换为用于发送消息的机器指令。为了生成正确的机器指令,编译器必须知晓每个参数的大小和类型,以及返回值的类型。
与 Java 不同,Java 会尽力确保编译器确切知道如何构建每个方法调用。Java 总是掌握每个类的详细信息,对象引用的类也总是明确的,并且 Java 方法签名保证了方法期望的参数类型不会有任何歧义。而 Objective-C 则相对宽松,这偶尔会导致方法调用的确切含义模糊不清的情况。
大多数时候,编译器清楚该怎么做。如果接收者的变量类型是指向特定类的指针,并且该类的方法原型已经编译,编译器就拥有了所需的全部信息。但如果编译器没有编译该方法的原型,或者接收者的类不明确(如 id 类型),编译器要么猜测参数类型,要么从已知的方法原型中任意选择一个。
3. 未声明的方法
当方法原型从未被编译时,就会出现未声明方法的情况。这可能是因为省略了类定义,或者类定义不完整,该方法可能在类的某个类别中声明,也可能根本未声明。
以下是一个未声明方法调用的示例:
超级会员免费看
订阅专栏 解锁全文
1439

被折叠的 条评论
为什么被折叠?



