3

如果您尝试混合使用类和协议,在 Objective-C 中意味着什么?如果类不符合协议,我试图让编译器在编译器时警告我。例如:

@protocol FLLiveDataProtocol <NSObject>
...
@end

- (id)initWithDataPath:(NSString *)path usingDataClassFactory:(Class<FLLiveDataProtocol>)dataFactoryClass;

但是,当我尝试这个时,我会遇到各种有趣的问题。首先,如果您传入一个不符合协议的类,它不会触发编译器错误,其次,如果您尝试执行 [[dataFactoryClass] alloc] init] 甚至通过协议符合 NSObject。

我还没有看到很多人试图混合协议和 Class 关键字的例子(我应该说 Typedef——感谢 Nikolai)。

我知道我可以使用 conformsToProtocol 在运行时进行检查,但如果我能在编译时检查它会很好。

4

2 回答 2

7

Objective-C 中的类对象没有静态类型信息(请参阅此问题),因此无法表示类需要符合协议。

旁注:Class不是关键字,而是 objc.h 中的 typedef:

typedef struct objc_class *Class;
于 2013-09-02T20:10:57.297 回答
1

其次,如果您尝试执行 [[dataFactoryClass] alloc] init],即使协议符合 NSObject,您也会收到诸如“不知道选择器分配的类方法”之类的错误。

原因是您的协议或NSObject 协议都没有声明+alloc. 您可以通过在协议声明中添加一个+alloc方法(或返回新实例的其他类方法)来解决此问题。

于 2013-09-03T10:20:42.563 回答