为什么我需要类扩展来使方法变为私有?

时间:2012-09-27 22:19:34

标签: objective-c ios

我一直在阅读有关此内容的内容,我不明白为什么人们会添加类扩展以使方法变为私有。

将它从头文件中删除是不够的? 它看起来足够了,但我可能会错过更重要的一点?

4 个答案:

答案 0 :(得分:3)

简短的回答:现在(我认为,从Xcode 4.4开始),你没有。原因:您不需要转发声明方法。将您的私有方法放在.m文件中,然后就完成了。

以前(Xcode 4.3及更早版本),您必须先转发声明您的方法,然后再调用它们。因为您已经在.h文件中声明了类,所以不能在.m文件中再次声明它,因此类扩展是将方法添加到已声明的类的方法。

编辑:如上面提到的@Yar(及以下),未声明的.m文件中的私有方法对该类的子类不可见,这意味着它是不可能的该子类调用或覆盖该方法。尽管如此,我还是倾向于不打扰声明它,除非/直到你最终得到一个需要覆盖或调用它的子类。对我来说,这种情况很少发生。

答案 1 :(得分:1)

将它从头文件中删除就足够了,但是你的子类也不知道它在那里。这意味着如果您尝试调用这些私有方法,则会出现编译器错误。这就是您使用类扩展的外部文件的原因,并且所有子类都在.m文件中导入该扩展

显然,这种情况并不理想,因为每个类最少有三个文件,但Objective-C的乐趣在于制作大量文件而不用担心。如果你害怕制作文件,你最终会得到大班,which is an anti-pattern

一个问题是命名类扩展文件,因为它是一个没有,类别的类别。我一直在使用像Blah4Subclasses这样的计划,这可能与你得到的建议差不多。

答案 2 :(得分:1)

课程延续与访问无关,与翻译无关。 objc语言没有指定方法的访问权限。所以这是一个相对弱的私人。最终落后的是能够在实现文件中隐藏方法声明。

要带走的重点是,类继续通常只对您的类可见(因为它通常放在*.m文件中)。此模式降低了私有方法使用的可能性,因为它对客户端或编译器不可见(除了典型的包含类“@implementation的翻译之外的翻译结构)。

另请注意,课程延续能力很强 - 所以这是存放私人@interface的便利场所;属性,ivars,方法。

最后,这也是早期的习惯,因为这是一种更常见的必需品。不久前,声明被添加,因此编译器知道对象响应特定的选择器,以及该选择器的签名。因为clang这几天解析了整个@implementation块,很多人发现它们不需要类继续中的声明,因为编译器可以匹配@implementation中看到的方法,无论声明的顺序如何。

答案 3 :(得分:0)

您可以在.h文件中添加@private。