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

时间:2013-01-21 16:13:27

标签: ios objective-c

以这些方式宣布这些协议之间的区别是什么?只是.h文件中的那些是公开的吗?

in .h file:
@interface TestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

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

4 个答案:

答案 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) {...}

透明度通常是一个好主意,很少是不利的。