在公共接口和私有接口/实现文件上声明协议的区别

以这些方式声明这些协议的区别是什么? 只是在.h文件中的公开可用吗?

in .h file: @interface TestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> in .m file: @interface TestViewController () <UISearchBarDelegate, UISearchDisplayDelegate, UIAlertViewDelegate, MKMapViewDelegate, CLLocationManagerDelegate> 

将协议添加到.h文件时,会告诉包含头文件的所有人,该类遵守给定的协议。

将协议添加到.m文件时,这基本上是一个私有的指示,表明该类遵守协议。 只有实现知道。

当外部类需要知道该类遵守协议时,应该只使用第一种forms(在.h文件中)。 当只有实现关心时,你应该使用第二种forms(在.m文件中)。

在你给的例子中,其他类不太需要知道遵守表视图协议的类。 这些应该在.m文件中。 也不太可能有其他类需要知道search协议。 这些是实现细节。 这些属于.m文件。

有可能会使用两者。 这可以。

这是我的准则。 把它放在.m文件中,除非你有特殊的需要让其他类知道协议的使用。

除非我错了,否则不可能使用forward声明@protocol Foo; 如果您还声明您的class级正在采用该协议。

这意味着在你的类的头文件中,你需要包含/导入另一个头文件和协议声明。 根据项目的大小和复杂性,这可能导致头文件“依赖地狱”。

这是否是一个真正的危险,必须由实际项目来判断。 大多数情况下,这可能不是你需要关心的事情,但我只是想提一下这个angular度。

我承认这不可能是风格的问题!

为什么要在.m中隐藏这些协议,可能是你的类会使用一些框架。 在那里.h是可见的,每个人都可以看到“哦,啊,这是这个class级的代表协议”。 而不是隐藏的魔法。

所以,它是透明的,而不是不透明的。

我更喜欢第一种方式,所以谁使用这个类就知道这个类是否实现了一些协议。 这只能是一个优势。

协议被用来保证实现一些方法,这是Objective-C中不可能实现的多重inheritance的替代方法。 假设我想将一个符合某种协议的对象传递给一个函数或方法,并且我必须确定这个类实现了一些协议。 在这种情况下, 我必须知道该类正在实现哪些协议

它也closures了一些编译器警告给这样的函数(或方法):

 void foo(id< SomeProtocol> obj) {...} 

透明度通常是一个好主意,而且很less是一个缺点。