Cocoa touch 关于“的持续警告消息”;initWithDelegate";!

Cocoa touch 关于“的持续警告消息”;initWithDelegate";!,cocoa-touch,xcode,delegates,naming-conventions,Cocoa Touch,Xcode,Delegates,Naming Conventions,这不是一条真正的Xcode错误消息,这是一条多年来一直困扰着我的警告 很长时间了。我没有办法删除它,我想我可能已经超越了一些不成文的命名规则 如果我构建一个类,通常是扩展NSObject,它的唯一目的是执行一些任务并在有数据时报告,我通常会给它一个方便的构造函数,比如“initWithDelegate” 我在当前项目中第一次这样做是为了一个名为ISWebservice的类,该类有如下协议: @protocol ISWebserviceDelegate @optional - (void) s

这不是一条真正的Xcode错误消息,这是一条多年来一直困扰着我的警告 很长时间了。我没有办法删除它,我想我可能已经超越了一些不成文的命名规则

如果我构建一个类,通常是扩展NSObject,它的唯一目的是执行一些任务并在有数据时报告,我通常会给它一个方便的构造函数,比如“initWithDelegate”

我在当前项目中第一次这样做是为了一个名为
ISWebservice
的类,该类有如下协议:

@protocol ISWebserviceDelegate

@optional

- (void) serviceFailed:(NSError*) error;
- (void) serviceSuccess:(NSArray*) data;

@required

@end
在我的ISWebservice.h接口中声明,就在导入语句的正下方

我还有其他类使用一个名为“initWithDelegate”的方便构造函数。 例如,“InternetConnectionLost.h”,该类没有可选的方法,声明中没有@optional@required标记,即它们都是必需的

现在,每当我使用比ISWebservice更晚编写的便利构造函数实例化其中一个类时,我的警告就会弹出,因此,当使用“InternetConnectionLost”类时,即使拥有“InternetConnectionLost”对象的整个类与“ISWebservice”类无关,也不会调用导入和方法,没有,警告是:“ClassOwningInternetConnectionLost”未实现“ISWebserviceDelegate”协议

我没有破坏任何东西,在运行时崩溃,也没有对我造成任何伤害,但它已经开始困扰我,因为我即将发布。另外,因为有几个类使用“initWithDelegate”构造函数命名,我的构建结果中有18个警告,我不确定我是否做错了什么,因为我对这种语言还相当陌生


希望有人能解释一下这个警告,谢谢:)

你收到了这个警告,因为编译器认为这些类已经声明它们实现了
ISWebserviceDelegate
协议。我怀疑它与
intiWithDelegate
方法有任何关系,除非您继承了该方法,或者您在协议中定义了该方法,该协议本身就是
ISWebserviceDelegate
协议的扩展

通常的原因是在一个超类中声明采用了该协议,然后忘记在后续子类的该超类中实现

如果您确定不是这样,那么您可能只需要清理项目并重建。您很可能在某一点上声明过,然后未声明,但编译器仍停留在旧的声明上


如果清理无法解决问题,我会在
ISWebserviceDelegate
上进行一个项目查找,并确保它不会隐藏在某个地方

您收到警告,因为编译器认为类已声明它们实现了
ISWebserviceDelegate
协议。我怀疑它与
intiWithDelegate
方法有任何关系,除非您继承了该方法,或者您在协议中定义了该方法,该协议本身就是
ISWebserviceDelegate
协议的扩展

通常的原因是在一个超类中声明采用了该协议,然后忘记在后续子类的该超类中实现

如果您确定不是这样,那么您可能只需要清理项目并重建。您很可能在某一点上声明过,然后未声明,但编译器仍停留在旧的声明上


如果清理无法解决问题,我会在
ISWebserviceDelegate
上进行一个项目查找,并确保它不会隐藏在某个地方

原因是您的项目中有多个接口,这些接口的函数定义为initWithDelegate:(id)

Alloc只返回id,因此编译器不知道类型,因此不知道使用哪个initWithDelegate,并且似乎使用列表中的第一个。因此,你会得到一个毫无意义的警告

然而,运行时知道对象的类型,因此不会有任何问题

解决方案似乎是使用更详细的init方法,例如initWithWebServiceDelegate。或在alloc之后铸造:

[(Foo *)[Foo alloc] initWithDelegate:self]

这里的原因是您的项目中有多个接口,这些接口的函数定义为initWithDelegate:(id)

Alloc只返回id,因此编译器不知道类型,因此不知道使用哪个initWithDelegate,并且似乎使用列表中的第一个。因此,你会得到一个毫无意义的警告

然而,运行时知道对象的类型,因此不会有任何问题

解决方案似乎是使用更详细的init方法,例如initWithWebServiceDelegate。或在alloc之后铸造:

[(Foo *)[Foo alloc] initWithDelegate:self]

高科技。谢谢你的建议,它们都很好,我看了一遍,但还是没有运气。这一警告已经存在了一个多月,在这段时间里,许多“清洁所有目标”已经完成。我确保没有实现ISWebserviceDelegate的带有警告的类,它们都扩展了NSObject、UIViewController或UIView。好吧,剩下的只有一个类别,可能是NSObject上的类别。可能在自定义构建脚本或其他内容中。我想它只在这一个项目上做?如果没有,那么您可能有一个损坏的Xcode首选项,您可以让其他人查看您的代码。当我们每天盯着它看的时候,一双新的眼睛经常看到我们看不到的东西。我已经看完了项目中的所有类别,没有运气。当你写它的时候,我确信那就是参考文献隐藏的地方。我想我得花几个小时在这个问题上,确保我在整个层次结构中都调查了你的建议。我很确定你已经回答了这个问题,但我还没有找到确切的答案:)再次感谢“新鲜的眼睛”。Hi-TechZen。谢谢你的支持