在Objective中为类定义私有方法的最佳方法

我刚刚开始编写Objective-C,并且拥有Java背景,不知道编写Objective-C程序的人是如何处理私有方法的。

我知道可能有几个约定和习惯,并将这个问题看作是人们在Objective-C中使用私有方法处理最佳技术的聚合器。

请在发布时提供参考。 为什么它好? 它有哪些缺点(你知道的)以及你如何处理它们?


至于我目前的发现。

可以使用MyClass.m文件中定义的类别[例如MyClass(Private)]来分组私有方法。

这种方法有两个问题:

  • Xcode(和编译器?)不检查是否在相应的@implementation块中定义了私有类别中的所有方法
  • 您必须将@interface声明为MyClass.m文件开头的私有类别,否则Xcode会抱怨类似“self可能无法响应消息”privateFoo“的消息。
  • 第一个问题可以用空类别解决[例如MyClass()]。
    第二个困扰我很多。 我希望在文件末尾附近实现(并定义)私有方法; 我不知道这是否可能。


    正如其他人所说的那样,在Objective-C中没有像私人方法那样的东西。 但是,从Objective-C 2.0开始(意思是Mac OS X Leopard,iPhone OS 2.0及更高版本),您可以创建一个名为空的类别(即@interface MyClass () ),称为类扩展。 类扩展的独特之处在于方法实现必须和公共方法一样在@implementation MyClass中。 所以我构建我的类如下所示:

    在.h文件中:

    @interface MyClass {
        // My Instance Variables
    }
    
    - (void)myPublicMethod;
    
    @end
    

    在.m文件中:

    @interface MyClass()
    
    - (void)myPrivateMethod;
    
    @end
    
    @implementation MyClass
    
    - (void)myPublicMethod {
        // Implementation goes here
    }
    
    - (void)myPrivateMethod {
        // Implementation goes here
    }
    
    @end
    

    我认为这种方法的最大优点是它允许你按功能分组你的方法实现,而不是(有时是任意的)公/私分类。


    Objective-C中没有真正的“私有方法”,如果运行时可以计算出使用它的实现将执行它。 但这并不是说没有方法不属于记录界面的一部分。 对于这些方法,我认为一个类别是好的。 我并没有将@interface放在.m文件的顶部,而是将它放在它自己的.h文件中。 我遵循的一个约定(我认为这是一个Apple惯例,因为Xcode现在给它提供了自动支持)是在它的类和类别之后命名一个文件,用+分隔它们,所以@interface GLObject (PrivateMethods)可以在GLObject+PrivateMethods.h找到。 提供头文件的原因是,你可以将它导入你的单元测试类:-)。

    顺便说一下,就在.m文件结尾附近实现/定义方法而言,您可以通过在.m文件底部实现类别来实现该功能。

    @implementation GLObject(PrivateMethods)
    - (void)secretFeature;
    @end
    

    或者使用类扩展(你称之为“空类”),最后定义这些方法。 Objective-C方法可以在实现中以任何顺序定义和使用,所以没有什么可以阻止你将“私有”方法放在文件的末尾。

    即使使用类扩展,我也会经常创建一个单独的头文件( GLObject+Extension.h ),以便我可以根据需要使用这些方法,模仿“朋友”或“受保护”可见性。

    由于这个答案是最初编写的,所以clang编译器已经开始为Objective-C方法做两遍了。 这意味着您可以避免完全声明您的“私有”方法,以及它们是否位于编译器可以找到的调用站点之上或之下。


    虽然我不是Objective-C的专家,但我个人只是在实施我的课程时定义了这个方法。 当然,它必须在任何调用它的方法之前(上面)定义,但它绝对只需要最少量的工作。

    链接地址: http://www.djcxy.com/p/85145.html

    上一篇: Best way to define private methods for a class in Objective

    下一篇: Best way to remove from NSMutableArray while iterating?