【问题标题】:When Should You Add Methods To A Private Interface?什么时候应该向私有接口添加方法?
【发布时间】:2012-10-30 23:16:56
【问题描述】:

所以我最近在我的课程中使用了更多的私有接口。我一直在.h(公共)中保留其他类所需的东西,然后将所有其他方法保留在.m中的私有接口中。我的问题是,我看不出有任何理由在我的私有界面中保留任何方法,因为没有这个应用程序可以正常工作。真正的意义是什么?为什么私有接口中没有像 viewDidLoad 这样的系统方法?

【问题讨论】:

    标签: iphone objective-c ipad cocoa-touch


    【解决方案1】:

    使用最新的 LLVM 编译器,在私有类别中添加方法声明已过时。过去,方法必须以正确的顺序实现,或者您可以在 .m 文件的私有类别中添加方法声明。最新的编译器不需要这样做。新编译器执行 2-pass 编译,因此它知道所有方法。

    所以对您的问题的简短回答是 - 从不。 :)

    编辑:以下是一些示例代码,以反映对此答案的持续讨论:

    在.h文件中:

    // Only public stuff here
    @interface Foo
    - (void)somePublicMethod;
    @end
    

    .m 文件中:

    // private additions - clients don't need to know about this stuff
    @interface Foo () <UIActionSheetDelegate, UIPickerViewDelegate>
    @property (nonatomic) UIPickerView *pickerView; // private property
    @end
    
    @implementation Foo {
        UIActioSheet *_myActionSheet; // private ivar
    }
    
    - (void)somePrivateMethod {
        [self anotherPrivateMethod]; // yeah - I can call methods further down in the class
    }
    
    - (void)anotherPrivateMethod {
    }
    @end
    

    【讨论】:

    • 苹果使用 LLVM?显然我落后了。
    • @RobertHarvey 仅在过去两年(给予或接受)。
    • 所以我不必在类的头文件中声明方法,除非外部类需要对其采取行动?
    • .h 文件仅在一个类需要引用另一个类时才需要,以便第一个类可以了解其公共接口。由于没有一个类是单独使用的,所以你最终还是会得到一个 .h 的类声明。
    • 是的,但我的意思是如果我有一个方法 [self doSomething];在仅在该类中调用的类中,我是否需要声明该方法?
    【解决方案2】:

    所以我最近在我的课程中使用了更多的私有接口。我一直将其他类所需的东西留在 .h(公共)中,然后将所有其他方法保留在 .m 中的私有接口中。

    太完美了。在某些情况下,您会希望使用命名约定或前缀来避免命名冲突。继续……

    我的问题是,我认为没有任何理由在我的私有界面中保留任何方法,因为没有这个应用程序可以正常工作。真正的意义是什么?

    Encapsulation。对您的客户(甚至子类)隐藏您的数据和实现,以尽量减少您必须进行的任何更改的副作用。如果客户端真的只需要公共接口中的 3 个方法——只声明这 3 个方法。将实现细节的其余部分保持为类的私有。当你不使用它时,突变的实现往往会在客户端使用这些不必要的方法的地方成倍增加。这意味着当您需要更改某些内容时,您将需要查看多个源文件(和应用程序,如果您编写库的话)的大量细节。一个类的公共接口是一个专注于最小化的好领域。

    为什么私有接口中没有像 viewDidLoad 这样的系统方法?

    viewDidLoad设计在必要时被子类覆盖。它的声明是公开的,主要有两个原因:

    • 文档。您的实现将需要此初始化步骤,并且您需要知道如何正确覆盖它。
    • 所以你可以写[super viewDidLoad],编译器可以保证你在做正确的事。如果UIViewController 没有将其声明为实例方法,则至少会出现一个编译器警告。

    【讨论】:

    • 是的,我意识到 rmaddy 的回答非常不同。根据 OP 的措辞,似乎 OP 实际上并没有(仅)询问 @interface 范围内的声明。
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2022-01-02
    • 2011-04-13
    • 2023-04-02
    • 2020-11-02
    • 2010-10-13
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多