Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C类关键字和协议_Objective C - Fatal编程技术网

Objective-C类关键字和协议

Objective-C类关键字和协议,objective-c,Objective C,在Objective-C中,如果您尝试混合类和协议,这意味着什么?我试图让编译器在编译时警告我,如果一个类不符合协议。例如: @protocol FLLiveDataProtocol <NSObject> ... @end - (id)initWithDataPath:(NSString *)path usingDataClassFactory:(Class<FLLiveDataProtocol>)dataFactoryClass; @protocol FLLiveD

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

@protocol FLLiveDataProtocol <NSObject>
...
@end

- (id)initWithDataPath:(NSString *)path usingDataClassFactory:(Class<FLLiveDataProtocol>)dataFactoryClass;
@protocol FLLiveDataProtocol
...
@结束
-(id)initWithDataPath:(NSString*)路径使用DataClassFactory:(Class)dataFactoryClass;
然而,当我尝试这个的时候,我得到了所有有趣的问题。首先,如果传入一个不符合协议的类,它不会触发编译器错误;其次,如果尝试执行[[dataFactoryClass]alloc]init],即使协议符合NSObject,也会出现错误,例如“不知道选择器alloc的类方法”

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


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

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

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

typedef struct objc_class *Class;
其次,您将得到错误,例如“选择器的类方法未知” alloc“如果您试图通过 该协议符合NSObject


这是因为您的协议或declare
+alloc
。您可以通过向协议声明中添加
+alloc
方法(或返回新实例的其他类方法)来解决此问题

实际上,conformsToProtocol在运行时甚至不会确切地告诉您——为此,您需要对每个相关方法执行respondsToSelector。(这是“鸭子打字”的背面——要知道它不是鸭子,唯一的办法就是注意它不像鸭子,也不像鸭子一样走路或嘎嘎作响。)我认为你试图解决的问题是错误的。为什么数据工厂必须是一个类?如果你有一个实例,这会容易得多。我使用标准的工厂模式,因为我需要它基于给定的工厂类创建多个实例。我在协议中使用@required关键字(上面没有显示),因此如果它没有实现预期的方法,我将得到一个编译时错误。在使用conformsToProtocol时,这给了我合理的舒适度。您知道语法类对编译器意味着什么吗?在使用该语法时,它没有给出错误。它类似于
id
,但如果传入了已知不是类的内容(例如
NSArray*
),它会发出警告。哇,这真的很有趣。我假设alloc是由NSObject定义的。我需要阅读更多关于ObjC运行时的内容。Alloc由一个NSProxy类实现,该类使用属性将自身附加到NS\u ROOT\u类。非常有趣。我必须尝试在协议中定义一个alloc方法,看看会发生什么。我不确定为什么您认为Obj-C运行时与此相关
+alloc
由类NSObject实现(并且独立地由NSProxy类实现),只是没有在NSObject协议中声明(它们都符合该协议)。很可能您的类确实实现了+alloc,但是静态类型
class
没有将其传递给编译器。虽然我同意,但奇怪的是NSObject协议没有声明它。