以这些方式宣布这些协议之间的区别是什么?只是.h文件中的那些是公开的吗?
in .h file:
@interface TestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
in .m file:
@interface TestViewController () <UISearchBarDelegate, UISearchDisplayDelegate, UIAlertViewDelegate, MKMapViewDelegate, CLLocationManagerDelegate>
答案 0 :(得分:27)
当您将协议添加到.h文件时,这会告诉每个人包含该类符合给定协议的头文件。
将协议添加到.m文件时,这实际上是该类遵守协议的私有指示。只有实现知道。
当外部类需要知道类遵守协议时,您应该只使用第一个表单(在.h文件中)。当只有实现关心时,你应该使用第二种形式(在.m文件中)。
在您给出的示例中,其他类不太可能需要了解遵守表视图协议的类。那些应该在.m文件中。任何其他类都不太可能需要了解搜索协议。这些是实现细节。这些属于.m文件。
可能存在使用两者的情况。这很好。
这是'我的指南。将它放在.m文件中,除非您特别需要让其他类知道协议的使用。
答案 1 :(得分:4)
除非我弄错了,否则如果您宣布您的班级正在采用该协议,则无法使用转发声明@protocol Foo;
。
这意味着在您的类的头文件中,您需要使用协议声明包含/导入另一个头文件。根据项目的大小和复杂程度,这可能导致头文件“依赖地狱”。
这是否真正危险必须由实际项目来判断。大部分时间它可能不是你需要关心的事情,但我只想提到这个角度。
答案 2 :(得分:3)
我承认这不是风格问题!!!
为什么要在.m中隐藏这些协议,可能是你的类会使用某些框架。有.h是可见的,每个人都可以看到“哦,啊,这些是这个类的代表协议”。而不是隐藏的魔法。
因此,它是透明的而不是不透明的。
答案 3 :(得分:1)
我判断第一种方式更好,所以谁使用该类知道该类是否实现了一些协议。这只是一个优势。
协议用于保证实现某些方法,这是多重继承的替代方法,这在Objective-C中是不可能的。假设我想将符合某种协议的对象传递给函数或方法,我必须确保这个类实现了一些协议。在这种情况下我必须知道该类正在实现哪些协议。
它还会对这些函数(或方法)关闭一些编译器警告:
void foo(id< SomeProtocol> obj) {...}
透明度通常是一个好主意,很少是不利的。