Iphone 什么时候应该向私有接口添加方法?
所以我最近在我的类中使用了更多的私有接口。我一直将其他类所需的东西保留在.h(public)中,然后将所有其他方法保留在.m的私有接口中。我的问题是,我看不出有任何理由在我的私有界面中保留任何方法,因为没有这个应用程序就可以正常工作。真正的意义是什么?为什么像viewDidLoad这样的系统方法不在私有接口中?在私有类别中添加方法声明对于最新的LLVM编译器来说是过时的。过去,方法必须以正确的顺序实现,或者可以在.m文件的私有类别中添加方法声明。最新的编译器排除了这种需要。新的编译器执行两次编译,因此它了解所有方法 因此,对你的问题的简短回答是——永远不要。:) 编辑:以下是一些示例代码,以反映对此答案正在进行的讨论: 在.h文件中:Iphone 什么时候应该向私有接口添加方法?,iphone,objective-c,ipad,cocoa-touch,Iphone,Objective C,Ipad,Cocoa Touch,所以我最近在我的类中使用了更多的私有接口。我一直将其他类所需的东西保留在.h(public)中,然后将所有其他方法保留在.m的私有接口中。我的问题是,我看不出有任何理由在我的私有界面中保留任何方法,因为没有这个应用程序就可以正常工作。真正的意义是什么?为什么像viewDidLoad这样的系统方法不在私有接口中?在私有类别中添加方法声明对于最新的LLVM编译器来说是过时的。过去,方法必须以正确的顺序实现,或者可以在.m文件的私有类别中添加方法声明。最新的编译器排除了这种需要。新的编译器执行两次编译
// 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
@接口
范围内的声明。