【问题标题】:Rationale behind ad-hoc method definitions in Objective-CObjective-C 中的 ad-hoc 方法定义背后的基本原理
【发布时间】:2011-08-17 19:56:43
【问题描述】:

我开始使用 C++ 编程。正因为如此,我很早就被教导,对于每个定义,都应该有一个声明。对于成员函数,这是一个要求。

现在我已经开始学习 Objective-C,我有点“震惊”地发现你不需要将它们配对。显然,如果你不定义一个方法,它就不会被调用。如果你不声明一个方法,而是定义它,它就会被调用。

允许这种类型的即席定义的理由是什么?由于我对 C++ 有偏见,我发现阅读其他人的代码很烦人有时,方法没有被声明。很难大致了解该类的界面。

我在这里找到了几个答案:Objective c: method relation .h and .m。不幸的是,它们并不是很确定。

【问题讨论】:

    标签: objective-c methods definition


    【解决方案1】:

    Objective-C 和其他语言包括允许您动态定义方法的元编程工具,因此您可以声明特定方法并在运行时定义其他方法,您可以在此问题上查看此功能的经典示例关于how to implement method_missing like functionality on Objective-C

    至于另一端,已实现但未声明的方法,没有明确的方法可以在 Objective-C 上定义 private 方法,并且有时您想定义仅已知的方法您自己的课程,而不是其他所有人。因此,您无需在 .h 文件中声明该方法,而是在 .m 文件中实现它。

    编译器通常会抱怨您使用了未定义的方法,但您可以忽略这一点,也可以在 .m 文件中将这些私有方法声明为特殊类别,如下所示:

    @interface YourClass (PrivateMethods)
      - (void) somePrivateMethod;
    @end
    
    
    @implementation YourClass 
      - (void) somePrivateMethod { NSLog(@"Something!"); }
    @end
    

    像代理(本地或远程模式)这样的常见模式通常依赖于这些元编程工具才能使用,它们在 Java、Ruby、Python 和 Objective-C 本身等语言中很常见。

    【讨论】:

    • 我有这本书声称您可以使用@private 来保护您的方法...只是为了展示吗?
    • @private 用于变量,而不是方法。 Objective-C 和它的间接父类 Smalltalk 一样,没有私有方法的概念。
    • 在 ObjC2 中,您不应再将“PrivateMethods”放在私有 API 类别(现在为“扩展”)的括号中。这个词只是一个注释,但包含它会导致编译器不检查somePrivateMethod 是否已实现。如果您只使用@interface YourClass (),那么编译器将强制您实现interface 块中的所有方法。这是 ObjC2 中的一项新功能,也是一个受欢迎的补充。
    • @Rob:谢谢! @interface YourClass () 我肯定会用它来尽快发现愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2011-03-11
    • 2011-06-17
    • 2014-12-19
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多