我是否必须为类的所有私有方法声明一个类别?

Des*_*ume 2 iphone objective-c objective-c-category

假设我想让类的私有方法只对该类的实现可见,以便类的接口只公开需要公开的内容.在Xcode的一些最新版本中,我可以通过省略头文件中的方法声明来做到这一点.但是,一本好书建议我还应该在实现文件中声明一个类别并在其中声明该方法,如下所示:

// [in MyClass.m]
#import "MyClass.h"

// category declaration - is it really required?
// edit: it's a class extension declaration, I know, but it doesn't change much
@interface MyClass ()
- (void)myPrivateMethod;
@end

@implementation MyClass
- (void)myPrivateMethod
{
    // do something
}
// all methods here can call myPrivateMethod
@end
Run Code Online (Sandbox Code Playgroud)

确实,它确实可以编译和工作.而且,它没有类别/扩展声明部分,编译和工作正常.这提出了一个自然的问题:

如果我有一堆私有方法,我是否需要在一个类别中声明所有这些方法?什么是最佳做法?

das*_*ght 6

这不是类别,它是类扩展(请注意,没有类别名称,括号为空).

将私有方法添加到类扩展是一个非常好的主意.这样做可确保所有方法都具有声明,并且这些声明仅对您希望它们可见的代码部分可见.

请注意,与普通类别不同,类扩展允许您添加实例变量.当您的实现依赖于不属于您的类的接口的类时,这非常方便.

  • GCC_WARN_UNDECLARED_SELECTOR - 设置检查器中的"未声明的选择器".这是一篇相关且有用的博客文章.查看评论.http://boredzo.org/blog/archives/2009-11-07/warnings (3认同)
  • 我建议启用"不允许在没有事先声明的情况下实现方法"并强制自己使用扩展来声明所有私有方法.使快速提醒自己实现细节变得更加容易. (2认同)