20

以这些方式声明这些协议有什么区别?仅仅是.h文件中的那些是公开的吗?

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

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

4 回答 4

27

当您将协议添加到 .h 文件时,这会告诉包含头文件的每个人该类遵守给定的协议。

当您将协议添加到 .m 文件时,这本质上是该类遵守协议的私有指示。只有实现知道。

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

在您给出的示例中,其他类不太可能需要了解遵守表视图协议的类。这些应该在 .m 文件中。任何其他类也不太可能需要了解搜索协议。这些是实现细节。这些属于 .m 文件。

在某些情况下,您可能会同时使用两者。这可以。

这是我的指导方针。将它放在 .m 文件中,除非您有特殊需要让其他类知道该协议的使用。

于 2013-01-21T16:49:36.610 回答
4

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

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

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

于 2013-01-21T16:52:30.567 回答
3

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

为什么要在 .m 中隐藏这些协议,可能是您的类将与某些框架一起使用。.h 是可见的,每个人都可以看到“哦,yaaa,这些是这个类的委托协议”。而不是隐藏的魔法。

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

于 2013-01-21T16:47:07.763 回答
1

我判断第一种方式更可取,以便使用该类的人知道该类是否实现了某些协议。这只能是一个优势。

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

它还关闭了对函数(或方法)的一些编译器警告,如下所示:

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

透明度通常是一个好主意,很少是劣势。

于 2013-01-21T16:31:46.617 回答