【问题标题】:Do I have to declare a category for all private methods of a class?我是否必须为类的所有私有方法声明一个类别?
【发布时间】:2012-07-23 15:03:25
【问题描述】:

假设我想让一个类的私有方法只对该类的实现可见,以便该类的接口只公开需要公开的内容。在一些最新版本的 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

它确实可以编译和工作。此外,它确实可以在没有类别/扩展声明部分的情况下编译并正常工作。这就提出了一个自然的问题:

如果我有一堆私有方法,我需要将它们都声明在一个类别中吗?最佳做法是什么?

【问题讨论】:

    标签: iphone objective-c objective-c-category


    【解决方案1】:

    This is not a category, it's a class extension(注意没有类别名称,括号为空)。

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

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

    【讨论】:

    • 我知道这是一个扩展,只是习惯于在我的脑海中称其为 无名类别。戒掉这个习惯..
    • LOL 出于某种原因,category 一词从来没有让我觉得过于描述性。这就是为什么我一直将类别视为“命名扩展”:)
    • 我建议打开“不允许没有事先声明的方法实现”并强制自己使用扩展来声明所有私有方法。更容易快速提醒自己实施细节。
    • @bbum 非常感谢您的精彩提示,我不知道检查此选项是否已存在!从现在开始,我将在我的所有项目上启用它,我相信它会帮助我找到一两个缺失的声明:)
    • GCC_WARN_UNDECLARED_SELECTOR -- 设置检查器中的“未声明的选择器”。这是一篇相关且有用的博客文章。见 cmets。 boredzo.org/blog/archives/2009-11-07/warnings
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2014-11-07
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多