Omar 的回答是正确的——询问对象是否会响应选择器是探测对象以查看它们是否会在运行时响应方法的首选方法。但是,问题是“如何自动验证所有方法都已声明?” (大概在编译时)。答案是,如果不自己写一些东西,你就不能自动做到这一点。
这是使 Objective-C “动态”的部分原因。您不必在任何地方声明方法。这使事情成为可能,例如:
id anUnknownObject = [[NSClassFromString(whoKnowsWhatIllBe) alloc] init];
[anUnknownObject performSelector:@selector(whoKnowsWhatIllDo)];
这意味着,例如,您可以从 Web 服务中获取一个字符串并仅基于该字符串实例化一个类(当然,该类必须在运行时存在才能被实例化,但编译器没有线索)。
这并不意味着您应该以这种方式编程,但它意味着它是可能的,并且与大多数事情一样,有适当的用例,这是语言的一个很大区别。它促进了极端的解耦、多态性和非常有趣的模式。
在 .m 类扩展中声明私有方法通常被认为是最佳实践,但它的价值是针对程序员,而不是编译器。一些人(包括一个暂时在公共论坛上匿名的 Objective-C 的主要贡献者)也建议没有必要在一个文件中输入所有方法的名称两次(更少的代码,更少的错误——如果你是第一次看别人的课,那就多滚动一下)。拥有漂亮整洁的公共 API 正是标头的用途。有一个干净的实现很重要,但假设是一旦你在 m 中,无论如何你都在私人领域。滚动。查看方法名称是什么。