我一直在阅读有关此内容的一些信息,但我不明白为什么人们添加类扩展以使方法私有。
将它从头文件中删除就足够了吗?在我看来已经足够了,但我可能遗漏了更重要的一点?
简短的回答:现在(我认为从 Xcode 4.4 开始),你没有。原因:您不需要转发声明方法。把你的私有方法放在你的 .m 文件中,你就完成了。
以前(Xcode 4.3 和更早版本),您必须先转发声明您的方法,然后才能调用它们。因为你已经在 .h 文件中声明了这个类,你不能在 .m 文件中再次声明它,所以类扩展是向已经声明的类添加方法的方法。
编辑:正如上面(和下面)提到的@Yar,.m 文件中未声明的私有方法对该类的子类不可见,这意味着该子类不可能调用或覆盖该方法。尽管如此,我还是倾向于不去声明它,除非/直到你最终得到一个需要覆盖或调用它的子类。对我来说,这种情况很少发生。
将它从头文件中删除就足够了,但是您的子类也不知道它在那里。这意味着如果您尝试调用这些私有方法,则会出现编译器错误。这就是为什么您使用作为类扩展名的外部文件,并且所有子类都在 .m 文件中导入该扩展名的原因。
显然,这种情况并不理想,因为每个类至少需要三个文件,但 Objective-C 的乐趣在于制作大量文件,而不用担心它。如果你害怕制作文件,你最终会得到大类,这是一种反模式。
一个问题是命名类扩展文件,因为它是一个没有,嗯,类别的类别。我一直在使用像 Blah4Subclasses 这样的方案,这可能是你得到的最糟糕的建议。
类延续与访问无关,翻译。objc 语言没有指定方法的访问权限。所以它是一个相对较弱的私人。人们最终依赖的是在他们的实现文件中隐藏方法声明的能力。
要带走的重要一点是,类延续通常只对您的类可见(因为它通常放在*.m
文件中)。这种模式降低@implementation
了使用私有方法的可能性,因为它对客户端或编译器不可见(在典型结构中包含类的翻译除外)。
还要注意,类延续有很多能力——所以它是一个方便的地方来存储你的私人@interface
;属性,ivars,方法。
最后,这也是早期的一种习惯,因为它是一种更频繁的必需品。不久前,添加了声明,因此编译器知道对象响应了特定的选择器,以及该选择器的签名。因为如今 clang 解析了整个 @implementation 块,许多人发现他们不需要类延续中的声明,因为编译器可以匹配 @implementation 中看到的方法,而不管声明的顺序如何。
您可以在 .h 文件中添加 @private。