私有接口与私有方法 - 目标 c

Posted

技术标签:

【中文标题】私有接口与私有方法 - 目标 c【英文标题】:Private interface vs. private method - objective c 【发布时间】:2011-04-26 00:51:23 【问题描述】:

私有方法和私有接口有什么区别? 例如,我知道如果你在实现中定义了一个方法,而它的接口没有提及它,它就被认为是一个私有方法。我还看到了这样的事情:

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

.m 实现文件的内部。

【问题讨论】:

【参考方案1】:

@interface Foo() 在接口 Foo 上创建一个类扩展(我的立场是正确的,支持 bbum),这就像添加到接口的附加方法一样。有些人还使用@interafce Foo(Private)(类别)而不是() 的类扩展。这更像是从类外部将新方法“注入”到类中。

将它放在 .m 文件中只是防止其他东西在 .h 文件中“看到它”,但仅此而已。基本上人们通常在 .m 文件中使用类别或类扩展来指定私有接口,但它们也用于诸如 UIKit 使用类别将 rowsection 公共方法添加到 NSIndexPath 的事情。 (这可能会令人困惑。)

您实际上不需要以这种方式定义私有方法,但是如果您有一个名为 bar 的方法,它在源文件中定义 foo 之前调用方法 foo,您将收到编译器警告,例如“object self may not回应 foo”。您可以通过在定义 bar 或任何其他 foo 调用代码之前定义 foo 来摆脱它。普通的 C 和函数也是如此。

就像 Ole 所说的那样,这不会阻止任何人调用私有方法,它只是声明您打算将它们设为私有并导致编译器生成“可能不响应”警告,即使它们导入 .h 文件也是如此。

编辑

另请参阅http://www.friday.com/bbum/2009/09/11/class-extensions-explained/,了解有关类别与类扩展的一些说明。从编译器警告的角度来看,对于定义私有方法,类扩展看起来应该更正确,因为类别方法是可选的。希望我的书能解释这一点!

【讨论】:

命名类别 (foo) 和类扩展 () 之间存在巨大差异。 你有这个参考吗?我在“Objective-C 2.0 编程”一书中没有看到任何关于此的内容。似乎类别名称在我能说的所有内容中都是可选的。并不是说我是主要专家或其他任何人,但如果您能提供一个链接来解释(私人)和()之间的区别,那将会很有帮助。 没关系,我好像找到了你的博客friday.com/bbum/2009/09/11/class-extensions-explained 想知道为什么我的书没有提到这个? 我忘了我写过那个。好东西谷歌索引我的头。 类扩展是某种“objective-c 2.1”的东西吗?我以为我有关于这个主题的权威书籍,但我没有或者后来添加了一些东西......【参考方案2】:

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

【讨论】:

以上是关于私有接口与私有方法 - 目标 c的主要内容,如果未能解决你的问题,请参考以下文章

c#接口公共私有[重复]

C++类封装-公用接口与私有实现的分离

你如何使用你的接口的私有方法?

JDK9新特性

接口私有方法使用

接口和类的区别