私有接口与私有方法 - 目标 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 使用类别将 row
和 section
公共方法添加到 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的主要内容,如果未能解决你的问题,请参考以下文章