2009-06-05 28 views

回答

3

我觉得只要是某处定义并包含在你的文件之一编译,它被定义。 Objective-C中没有像“ClassName.java”这样的约定,就像在Java中一样。

当你想要做的事情一样categories对于像私有方法/属性这是非常有益的。

-1

在Objective-C中是一样的。因为协议是在类之间共享的方法列表。协议只是没有相应实现的方法列表。他们意味着要由其他人来实施。

3

协议通常在他们自己的.h文件中定义(以我的经验)。但是它们可以在shared.h文件中定义。很难让协议的用户在共享文件安排中采用协议,而且,它会混乱你的API。如果协议位于自己的.h文件中,文档和用法可能会更容易。

另外,如果你只需要包括协议.h文件中,而不是在有其他类的声明.h文件利用您的协议之类的多态的实现将有更少的开销。我不知道这种想法的确切成本/储蓄,但我读过会有一些(较小的二进制?)

问候, 弗兰克

19

我认为该协议的位置取决于你如何使用它。很多时候,一个协议被用来为另一个类定义委托或数据源的功能。如果是这样的话,我认为你可以放心地将协议定义放在另一个类的顶部 - 因为它们必须一起使用。

如果定义在地方共享的基类的协议,你应该把它放在一个单独的文件。例如,我有几个不同的类来实现“操作”协议。我的其他一些函数希望接收一个实现协议的对象,并且不关心实际的类。在这种情况下,将协议定义放在它自己的头文件中是很有意义的,所以你可以把它包含在它自己的头文件中。

Benny是对的 - 尽管从技术角度来看,它在定义为,无论你放在哪里(只要它被包含在使用之前的某个地方)。

+0

我一直在代码审查的地方,我发现一个协议被重写的类的数量,我创建一个单独的文件来定义protocol.but错过了导入该文件。你的答案“(只要它在使用之前包含在某个地方)。”谢谢+ – Alok 2014-11-01 09:11:55

0

这真的是Objective-C中风格的问题。我认为真正的“正确”方式是为协议创建一个单独的.h文件,如果我制作的协议不属于其他任何内容(例如NSCoding),那就是我所要做的。另一方面,大多数情况下,当我创建一个协议(或者一个非正式的协议,通过在NSObject上使用一个类别)时,它会绑定到另一个类,比如NSTableView的数据源非正式协议。在这些情况下,为了简单起见,我只是将该声明放在该类的头文件中。

0

还看到苹果公司的Communicating with Objects,其中讨论的代表,协议和选择。虽然它在Mac OS X中列出,但大多数(如果不是全部的话)似乎也适用于iOS。