私有方法和私有接口之间有什么区别?例如,如果在实现中定义一个方法,并且它的接口没有提到它,那么它就被认为是一个私有方法。我也看到过一些类似这样的东西:
@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end
在 .m 实现文件内部。
私有方法和私有接口之间有什么区别?例如,如果在实现中定义一个方法,并且它的接口没有提到它,那么它就被认为是一个私有方法。我也看到过一些类似这样的东西:
@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end
在 .m 实现文件内部。
@interface Foo()
创建了一个类扩展,在接口Foo上添加相当于附加方法的额外内容。有些人使用@interafce Foo(Private)
(类别)来代替带有()
的类扩展。这更像是从类外“注入”新方法到类中。
将其放置在.m文件中只是为了防止在.h文件中“看到它”,但仅此而已。基本上,人们通常在.m文件中使用类别或类扩展来指定私有接口,但也用于像UIKit使用类别向NSIndexPath添加row
和section
公共方法等方面。(这可能会让人感到困惑。)
你不需要以这种方式定义私有方法,但如果你有一个名为bar的方法,在foo方法之前调用foo方法,那么在源文件中定义foo方法之前,你将会得到一个编译器警告,类似于“对象self可能无法响应foo”。你可以通过在定义bar或任何其他调用foo代码之前定义foo来消除这个警告。在普通的C和函数方面也是一样。
正如Ole所说,这并不能阻止任何人调用私有方法,它只是声明了你的意图,使编译器生成“可能无法响应”的警告,即使它们导入.h文件。
编辑
另请参见http://www.friday.com/bbum/2009/09/11/class-extensions-explained/,了解类别与类扩展的一些解释。从编译器警告的角度来看,类扩展似乎更正确地定义了私有方法,因为类别方法是可选的。但愿我的书能解释清楚这个问题!
Objective-C没有完全私有的方法。在.m文件中声明为私有接口部分的方法对外部调用者来说是不可见的,但它并不是私有的。如果有人知道方法签名并忽略编译器警告,他们可以从外部调用它而不会出现问题。
(foo)
和类扩展()
之间存在很大的区别。 - bbum