Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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_Gcc - Fatal编程技术网

Objective c 以编程方式检查“指针不兼容”警告

Objective c 以编程方式检查“指针不兼容”警告,objective-c,gcc,Objective C,Gcc,我有以下协议和类开始 @protocol AnimalProtocol <NSObject> // this will be my global interface @interface Animal : NSObject // and a super class @interface Animal () <AnimalProtocol> // take note, I hid the protocol in .m file 如果我尝试使用addAnimal方法添加爬

我有以下协议和类开始

@protocol AnimalProtocol <NSObject> // this will be my global interface

@interface Animal : NSObject // and a super class
@interface Animal () <AnimalProtocol> // take note, I hid the protocol in .m file
如果我尝试使用addAnimal方法添加爬行动物的实例,就像这样

Reptile *lizard = [[Reptile alloc] init];
[AnimalList addAnimal:lizard];
它将生成一个警告

不兼容的指针类型将爬行动物*发送到Animal类型的参数*

这是真的,因为我隐藏了关于超级动物的协议。为了删除此警告,我需要在我的爬行动物类中包含协议声明,或者在动物类的.h上显示动物协议

我的问题是,如何生成上述GCC警告的编程版本?我希望我的addAnimal方法非常严格,如果爬行动物类不包含该协议,我想抛出一个异常

注意:我已经试过了

[[lizard class] conformsToProtocol:@protocol(AnimalProtocol)]

但它不起作用。它知道,爬行动物是动物的一个亚类,在无形中执行动物协议。但是GCC警告能够检测到它。因此,我想知道如何通过编程实现这一点。

编译器可以检测到的内容与运行时可以检查的内容之间没有1:1的对应关系。一般来说,运行时对定义的可见性一无所知,这是由于编译时的范围划分方式造成的。AnimalProtocol协议的要点是什么?为什么动物在私下里遵守它,而你却要求addAnimal:方法只接受同样遵守AnimalProtocol的动物对象。如您所知,爬行动物不符合AnimalProtocol协议。如果您想测试爬行动物是否支持给定的功能,请使用respondsToSelector。您的意思是要检查动物的子类是否提供其自身的AnimalProtocol实现,而不是从父类继承的?另外,您的Xcode不太可能仍然使用GCC而不是Clang。@rmaddy协议的目的是定义所需的方法。动物类实现了这些方法,为以后的子类分类奠定了基础。动物和动物协议将包含在我正在创建的框架内。现在我允许开发人员在框架外创建自定义的Animal子类,但是为了让他们将自定义的子类集成到singleton AnimalList,它必须是Animal的子类,并且必须实现协议-这确保子类确实覆盖了所需的方法
Reptile *lizard = [[Reptile alloc] init];
[AnimalList addAnimal:lizard];
[[lizard class] conformsToProtocol:@protocol(AnimalProtocol)]