Objective-C Class关键字和协议

时间:2013-09-02 19:54:38

标签: objective-c

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

@protocol FLLiveDataProtocol <NSObject>
...
@end

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

但是,当我尝试这个时,我会遇到各种有趣的问题。首先,如果你传入一个不符合协议的类,它不会触发编译器错误,如果你尝试[[dataFactoryClass],你会得到诸如“不知道选择器分配的类方法”之类的错误alloc] init]即使通过协议也符合NSObject。

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

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

2 个答案:

答案 0 :(得分:7)

Objective-C(see this question)中没有类对象的静态类型信息,因此没有办法表明类需要符合协议。

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

typedef struct objc_class *Class;

答案 1 :(得分:1)

  

第二,你会得到诸如“不知道选择器的类方法”之类的错误   如果您尝试执行[[dataFactoryClass] alloc] init],则“分配”   该协议符合NSObject。

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