我在Xcode中使用Objective-C。我想知道是否有任何机制来证明您的代码以确保所有函数和方法都在.h文件或私有@interface方法中声明?
澄清我将在编码相切并将直接在我的viewController.m文件中编写方法
- (Awesome*) generateAwesomeOfMagnitude:(NSFloat)magnitude { ...
我将忘记将标题添加到viewController.h文件中。如果这是一个私人方法,没有任何通知我,我已经这样做了所以我必须回过头来验证我完成时手动声明了所有内容。有没有办法自动检查?
注意:我希望让编译器发出警告。是否有一个设置真的是我应该问的。
答案 0 :(得分:3)
Omar的答案是正确的 - 询问对象是否会响应选择器是探测对象的首选方法,以查看它们是否会在运行时响应方法。但是,问题是“如何自动验证所有方法都被声明?” (大概是在编译时)。答案是,如果没有自己写一些东西,你就不能自动做到这一点。
这是使Objective-C'动态'的一部分。您不必在任何地方声明方法。这使事情成为可能:
id anUnknownObject = [[NSClassFromString(whoKnowsWhatIllBe) alloc] init];
[anUnknownObject performSelector:@selector(whoKnowsWhatIllDo)];
这意味着,例如,您可以从Web服务获取字符串并仅基于字符串实例化一个类(当然,该类必须在运行时才能实例化,但编译器不会有一个线索)。
这并不意味着应该以这种方式编程,但这意味着它可能,并且,与大多数事情一样,有适当的用例,并且它是语言的一个很大的区别。它促进了极端的解耦,多态性和有趣的模式。
在.m类扩展中声明私有方法通常被认为是最佳实践,但这个值对于程序员而不是编译器。一些(包括Objective-C的主要贡献者,暂时在公共论坛中无名)也建议不需要在一个文件中两次输入所有方法的名称(代码更少,更少的错误 - 如果你是第一次看别人的课,那就更多滚动了。拥有一个漂亮整洁的公共API正是标题的用途。有一个干净的实施是很重要的,但假设一旦你在m,你仍然在私人领域。滚动。看看方法名称是什么。
答案 1 :(得分:0)
要检查类使用中是否存在运行时方法
if([yourObject respondsToSelector:@selector(generateAwesomeOfMagnitude:)])
//has this method
else
//does not have this method
但如果您在.m中定义方法并且不在.h文件中包含它,则不会收到任何警告
但是,如果另一个类正在访问未在.h文件中声明的方法,则会收到警告