私有方法和私有接口有什么区别? 例如,我知道如果您在实现中定义方法并且其接口未提及它,则将其视为私有方法。我也见过如下事情:
@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end
.m实现文件内部。
答案 0 :(得分:20)
@interface Foo()
在接口Foo上创建了一个类扩展(我更正了,支持到bbum),就像添加到接口的其他方法一样。有些人还使用@interafce Foo(Private)
(类别)而不是()
的类扩展名。它更像是将新方法“注入”类外的类。
将它放在.m文件中只是让其他东西不会在.h文件中“看到它”,但就是这样。基本上人们通常在.m文件中使用类别或类扩展来指定私有接口,但它们也用于诸如UIKit使用类别向NSIndexPath添加row
和section
公共方法之类的东西。 (这可能令人困惑。)
你真的不需要以这种方式定义私有方法,但是如果你有一个名为bar的方法,在源文件中定义foo之前调用方法foo,你会得到一个编译器警告,例如“对象自身可能没有回应foo“。你可以在定义bar或任何其他foo调用代码之前通过定义foo来摆脱它。它与普通的C和函数一样。
就像Ole所说,这并没有阻止任何人调用私有方法,它只是声明你的意图是私有的,并导致编译器生成“可能不响应”警告,即使它们导入.h文件。
修改
另请参阅http://www.friday.com/bbum/2009/09/11/class-extensions-explained/了解类别与类扩展的一些解释。从编译器警告的角度看,类扩展应该更准确地定义私有方法,因为类别方法是可选的。希望我的书可以解释这个!
答案 1 :(得分:17)
Objective-C没有完全私有的方法。在.m文件的私有接口部分中声明的方法对外部调用者来说是不可见,但它不是私有的。如果有人知道方法签名并忽略编译器警告,他们可以从外部调用它而不会出现问题。