私有接口与私有方法 - Objective-C

18

私有方法和私有接口之间有什么区别?例如,如果在实现中定义一个方法,并且它的接口没有提到它,那么它就被认为是一个私有方法。我也看到过一些类似这样的东西:

@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end

在 .m 实现文件内部。

2个回答

21

@interface Foo() 创建了一个类扩展,在接口Foo上添加相当于附加方法的额外内容。有些人使用@interafce Foo(Private)(类别)来代替带有()的类扩展。这更像是从类外“注入”新方法到类中。

将其放置在.m文件中只是为了防止在.h文件中“看到它”,但仅此而已。基本上,人们通常在.m文件中使用类别或类扩展来指定私有接口,但也用于像UIKit使用类别向NSIndexPath添加rowsection公共方法等方面。(这可能会让人感到困惑。)

你不需要以这种方式定义私有方法,但如果你有一个名为bar的方法,在foo方法之前调用foo方法,那么在源文件中定义foo方法之前,你将会得到一个编译器警告,类似于“对象self可能无法响应foo”。你可以通过在定义bar或任何其他调用foo代码之前定义foo来消除这个警告。在普通的C和函数方面也是一样。

正如Ole所说,这并不能阻止任何人调用私有方法,它只是声明了你的意图,使编译器生成“可能无法响应”的警告,即使它们导入.h文件。

编辑

另请参见http://www.friday.com/bbum/2009/09/11/class-extensions-explained/,了解类别与类扩展的一些解释。从编译器警告的角度来看,类扩展似乎更正确地定义了私有方法,因为类别方法是可选的。但愿我的书能解释清楚这个问题!


8
命名类别(foo)和类扩展()之间存在很大的区别。 - bbum
你有这方面的参考资料吗?我在《Objective-C 2.0编程》一书中没有看到任何相关内容。据我所知,从所有信息来看,类别名称只是可选的。虽然我不是一个专家,但如果您能提供一个链接来解释(私有)和()之间的区别,那将会很有帮助。 - Nimrod
没事,我好像找到了你的博客http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ 不知道为什么我的书没有谈论这个? - Nimrod
我相信类扩展是在Objective-C 2.0中引入的,但我也可能记错了。 - johnw188
我能找到的唯一官方文档是苹果的文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1 我似乎找不到Objective-C 2.0的官方标准文档... - Nimrod
显示剩余3条评论

18

Objective-C没有完全私有的方法。在.m文件中声明为私有接口部分的方法对外部调用者来说是不可见的,但它并不是私有的。如果有人知道方法签名并忽略编译器警告,他们可以从外部调用它而不会出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接