在公共接口和私有接口/实现文件上声明协议的区别
以这些方式声明这些协议的区别是什么? 只是在.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是一个缺点。