Unless I'm missing something, it seems arbitrary in which .h file I put the protocol definition. I'm even wondering if it could be in it's own .h file... (in Java, it's in its own file)
6 回答
我认为协议的位置取决于您如何使用它。很多时候,协议用于为另一个类定义委托或数据源的功能。如果是这种情况,我认为您可以安全地将协议定义放在其他类的顶部 - 因为它们必然会一起使用。
如果你定义一个协议来代替共享基类,你应该把它放在一个单独的文件中。例如,我有几个不同的类实现“操作”协议。我的其他一些函数期望接收一个实现协议的对象,并且不太关心实际的类。在这种情况下,将协议定义放在它自己的头文件中是有意义的,这样您就可以自己包含它。
不过,Benny 是对的 - 无论您把它放在哪里,它都会在技术上被定义(只要它在使用之前包含在某个地方)。
I think as long as it is defined somewhere and included in one of the files you are compiling, it is defined. There are no conventions like "ClassName.java" in Objective-C like there is in Java.
This is pretty helpful when you want to do things like categories for things like private methods/properties.
协议通常在它们自己的 .h 文件中定义(根据我的经验)。但它们可以在 shared.h 文件中定义。很难让协议的用户在共享文件安排中采用协议,此外,它会使您的 API 混乱。如果协议在它自己的 .h 文件中,文档和使用可能会更容易。
此外,如果您只需要包含协议 .h 文件而不是具有其他类声明的 .h 文件,则将您的协议用于多态实现之类的东西会减少开销。我不确定这个想法的确切成本/节省,但我读过会有一些(更小的二进制文件?)
问候, 弗兰克
这实际上是 Objective-C 中的风格问题。我想真正“正确”的方法是为协议创建一个单独的 .h 文件,如果我正在制作一个不属于其他任何东西的协议(例如 NSCoding),那就是我会做的。另一方面,大多数时候,当我创建一个协议(或非正式协议,通过使用 NSObject 上的一个类别)时,它与另一个类相关联,例如 NSTableView 的数据源非正式协议。在这些情况下,为了简单起见,我只是将声明放在该类的头文件中。
另请参阅 Apple 的Communicating with Objects,其中讨论了委托、协议和选择器。尽管它在 Mac OS X 下列出,但大多数(如果不是全部)似乎也适用于 iOS。
在 Objective-C 中是一样的。因为协议是类之间共享的方法列表。协议只是没有相应实现的方法列表。它们旨在由其他人实施。