Iphone 什么时候应该向私有接口添加方法?

Iphone 什么时候应该向私有接口添加方法?,iphone,objective-c,ipad,cocoa-touch,Iphone,Objective C,Ipad,Cocoa Touch,所以我最近在我的类中使用了更多的私有接口。我一直将其他类所需的东西保留在.h(public)中,然后将所有其他方法保留在.m的私有接口中。我的问题是,我看不出有任何理由在我的私有界面中保留任何方法,因为没有这个应用程序就可以正常工作。真正的意义是什么?为什么像viewDidLoad这样的系统方法不在私有接口中?在私有类别中添加方法声明对于最新的LLVM编译器来说是过时的。过去,方法必须以正确的顺序实现,或者可以在.m文件的私有类别中添加方法声明。最新的编译器排除了这种需要。新的编译器执行两次编译

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

在私有类别中添加方法声明对于最新的LLVM编译器来说是过时的。过去,方法必须以正确的顺序实现,或者可以在.m文件的私有类别中添加方法声明。最新的编译器排除了这种需要。新的编译器执行两次编译,因此它了解所有方法

因此,对你的问题的简短回答是——永远不要。:)

编辑:以下是一些示例代码,以反映对此答案正在进行的讨论:

在.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
//私人添加-客户端不需要知道这些内容
@接口Foo()
@属性(非原子)UIPickerView*pickerView;//私有财产
@结束
@执行Foo{
UIActioSheet*\U myActionSheet;//私人ivar
}
-(无效)某种私有方法{
[self-anotherPrivateMethod];//是的-我可以调用类中更深层的方法
}
-(无效)另一种私有方法{
}
@结束
所以我最近在我的类中使用了更多的私有接口。我一直将其他类所需的东西保留在.h(public)中,然后将所有其他方法保留在.m的私有接口中

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

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

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

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

viewDidLoad
被设计为在必要时由子类重写。其声明公开有两个主要原因:

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

苹果使用LLVM?显然,我落后于形势。@RobertHarvey只在过去两年中(给予或接受)。因此,除非外部类需要对其进行操作,否则我不必在类的标题中声明方法。只有当一个类需要引用另一个类时,才需要h文件,以便第一个类可以知道其公共接口。因为没有一个类是单独使用的,所以在类声明中你仍然会得到一个.h,但是我的意思是如果我有一个方法[selfdosomething];在一个只在该类中调用的类中,我是否需要在任何地方声明该方法?是的,我意识到rmaddy的答案是非常不同的。根据OP的措辞,OP似乎并没有(仅仅)询问
@接口
范围内的声明。