如果你尝试混合Class和Protocol,它在Objective-C中意味着什么?如果一个类不符合协议,我试图让编译器在编译器时警告我。例如:
@protocol FLLiveDataProtocol <NSObject>
...
@end
- (id)initWithDataPath:(NSString *)path usingDataClassFactory:(Class<FLLiveDataProtocol>)dataFactoryClass;
但是,当我尝试这个时,我会遇到各种有趣的问题。首先,如果你传入一个不符合协议的类,它不会触发编译器错误,如果你尝试[[dataFactoryClass],你会得到诸如“不知道选择器分配的类方法”之类的错误alloc] init]即使通过协议也符合NSObject。
我还没有看到很多人试图混合协议和Class关键字的例子(我应该说Typedef - 感谢Nikolai)。
我知道我可以在运行时使用conformsToProtocol进行检查,但如果我能在编译时检查它会很好。
答案 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
方法(或其他返回新实例的类方法)来解决此问题。