除非我遗漏了某些东西,否则在我放置协议定义的.h文件中似乎是随意的。我甚至想知道它是否可以在它自己的.h文件中...(在Java中,它在它自己的文件中)
答案 0 :(得分:20)
我认为协议的位置取决于你如何使用它。很多时候,协议用于定义另一个类的委托或数据源的功能。如果是这种情况,我认为您可以安全地将协议定义放在另一个类的顶部 - 因为它们必然会一起使用。
如果要定义协议来代替共享基类,则应该将其放在单独的文件中。例如,我有几个不同的类来实现“操作”协议。我的一些其他函数期望接收实现协议的对象,并且不太关心实际的类。在这种情况下,将协议定义放在它自己的头文件中是有意义的,这样你就可以把它包含在它自己的头文件中。
但是,Benny是对的 - 无论你把它放在哪里,技术上都会定义(只要它被包含在使用之前的某个地方)。答案 1 :(得分:3)
我认为只要它在某个地方定义并包含在您正在编译的文件中,就会定义它。 Objective-C中没有类似“ClassName.java”的约定,就像在Java中一样。
如果您希望对私有方法/属性等内容执行categories等操作,这非常有用。
答案 2 :(得分:3)
协议通常在他们自己的.h文件中定义(根据我的经验)。但它们可以在shared.h文件中定义。很难让协议的用户在共享文件安排中采用协议,而且会使你的API混乱。如果协议在其自己的.h文件中,则文档和用法可能会更容易。
此外,如果您只需要包含协议.h文件而不是包含其他类声明的.h文件,那么将协议用于多态实现等操作会减少开销。我不确定这个想法的确切成本/节省,但我读过会有一些(较小的二进制文件?)
此致 弗兰克
答案 3 :(得分:0)
这几乎是Objective-C中的风格问题。我认为真正“正确”的方法是为协议创建一个单独的.h文件,如果我正在制作一个不属于任何其他东西的协议(例如NSCoding),那就是我要做的。另一方面,大多数时候,当我创建协议(或非正式协议,通过在NSObject上使用类别)时,它与另一个类绑定,如NSTableView的数据源非正式协议。在这些情况下,为了简单起见,我只是将声明放在该类的头文件中。
答案 4 :(得分:0)
另请参阅Apple的Communicating with Objects,其中讨论了委托,协议和选择器。虽然它在Mac OS X下列出,但大多数(如果不是全部)似乎也适用于iOS。
答案 5 :(得分:-1)
在Objective-C中是一样的。因为协议是类之间共享的方法列表。协议只是没有相应实现的方法列表。它们意在由其他人实施。