3

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

4

2 回答 2

3

使用最新的 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
于 2012-10-30T23:23:49.123 回答
0

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

那很完美。在某些情况下,您会希望使用命名约定或前缀来避免命名冲突。继续……</p>

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

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

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

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

  • 文档。您的实现将需要此初始化步骤,并且您需要知道如何正确覆盖它。
  • 因此,您可以编写[super viewDidLoad],并且编译器可以确保您在做正确的事情。如果UIViewController没有将其声明为实例方法,则至少会有一个编译器警告。
于 2012-10-30T23:58:40.067 回答