Objective-C 消息发送全解析
1. 类方法与消息编译基础
在 Objective-C 里,每个类方法都会把所有消息参数当作自动变量接收,这里面包含接收者和选择器。 self 变量存着指向接收者的指针,而 _cmd 变量则保存着消息选择器。不过通常 _cmd 变量没什么太大的关注价值,因为它始终是该方法的选择器。
Objective-C 编译器会把每个方法调用转化成能发送消息的机器指令。要想生成正确的机器指令,编译器得清楚每个参数的大小、类型以及返回值的类型。和 Java 比起来,Java 会花不少功夫确保编译器确切知道如何构建每个方法调用。Java 总是掌握着每个类的详细信息,对象引用的类也总是已知的,而且 Java 方法签名能保证方法期望的参数类型不会有任何歧义。但 Objective-C 就宽松多了,这偶尔会导致方法调用的确切含义变得模糊不清。不过要记住,这些都属于特殊情况,绝大多数时候,编译器都清楚该怎么做。要是接收者的变量类型是指向特定类的指针,并且该类的方法原型已经编译过,那编译器就掌握了所需的全部信息。可要是编译器没编译过该方法的原型,或者接收者的类不明确(也就是 id 类型),编译器就得要么猜测参数的类型,要么从已知的方法原型里随便选一个。
2. 未声明方法问题及解决办法
当方法原型从未被编译过时,就会出现未声明方法的情况。这可能是因为省略了类定义,或者类定义不完整,方法也许在该类的某个类别里声明了,又或者根本就没声明。就像下面这段代码:
超级会员免费看
订阅专栏 解锁全文
10

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



