Private interface vs. private method - objective c

jos*_*im5 16 private interface objective-c

What is the difference between a private method and a private interface? For example, I know that if you define a method in an implementation and its interface does not mention it, it is considered a private method. I have also seen things such as:

@interface Collector()
@property (readonly) NSMutableDictionary *count;
@end
Run Code Online (Sandbox Code Playgroud)

在.m实现文件中.

Nim*_*rod 20

@interface Foo()在接口Foo上创建一个类扩展(我站得更正,支持到bbum),就像添加到接口的其他方法一样.有些人也使用@interafce Foo(Private)(类别)而不是类扩展().它更像是从类外部"注入"新方法到类中.

将它放在.m文件中只是让其他东西不会在.h文件中"看到它",但就是这样.基本上人们通常在.m文件中使用类别或类扩展来指定私有接口,但它们也用于诸如UIKit使用类别添加rowsectionNSIndexPath的公共方法之类的东西.(这可能令人困惑.)

你真的不需要以这种方式定义私有方法,但如果你有一个名为bar的方法,在源文件中定义foo之前调用方法foo,你会得到一个编译器警告,例如"对象自身可能不响应foo" ".你可以在定义bar或任何其他foo调用代码之前通过定义foo来摆脱它.它与普通的C和函数相同.

就像Ole说这不会阻止任何人调用私有方法,它只是声明你的意图是私有的,并导致编译器生成"可能没有响应"警告,即使它们导入.h文件.

编辑

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

  • 命名类别`(foo)`和类扩展名`()`之间存在巨大差异. (8认同)

Ole*_*ann 18

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