采用类别的协议

时间:2011-07-06 01:37:43

标签: iphone objective-c ios cocoa macos

我想确认此修复程序确实有效并且不会对我的代码产生负面影响:

我已经创建了一个带有MyClass.h公共头的静态库,我的其余代码都是隐藏的。 MyClass采用MyProtocol协议,MyProtocol是在MyProtocol.h中定义的。我想隐藏MyProtocol.h,但由于MyClass.h是一个公共头,如果我试图将它隐藏为项目头,它就找不到MyProtocol.h。我的解决方案:

MyClass.h:

@interface MyClass : NSObject {
    //instance variables
}
// methods
@end

MyClass.m:

#import "MyProtocol.h"
@interface MyClass() <MyProtocol>
@end

@implementation MyClass
// implementation
@end

除了这里,我还没有看到其他类似事情的例子:Can a category simultaneously implement a protocol?,问题/答案最终与原始问题无关。 所以我想确保这实际上做了它看起来的样子,并且/或者看看是否有更好的方法来实现我想要做的事情。

1 个答案:

答案 0 :(得分:6)

您提出的建议是完全合法的,并且是您问题的良好解决方案。

有一个微妙的语义区别可能会混淆你对这个主题的谷歌搜索。通过在示例中使用空括号,您在技术上声明了“类扩展”,而不是“类别”。细微差别在于编译器要求在类扩展中声明的方法在类的主@implementation块中实现。相比之下,在命名类别中声明的方法是在单独的命名实现块中实现的,通常在单独的.m文件中。