这不是一个真正的Xcode错误消息,这是一个一直困扰着我的警告 很长时间。我发现没有办法删除它,我想我可能已经超越了一些不成文的命名约定规则。
如果我构建一个类,通常会扩展NSObject,它的唯一目的是执行某些任务并在有数据时报告,我经常给它一个方便的构造函数,如“initWithDelegate”。
我第一次在当前项目中执行此操作是为了一个名为ISWebservice
的类,其中包含如下协议:
@protocol ISWebserviceDelegate
@optional
- (void) serviceFailed:(NSError*) error;
- (void) serviceSuccess:(NSArray*) data;
@required
@end
在我的ISWebservice.h界面中,在我的import语句下面声明。
我有其他类使用名为“initWithDelegate”的便利构造函数。 例如。 “InternetConnectionLost.h”,但是这个类的方法不是可选的,声明中没有@optional @required标签,即它们都是必需的。
现在每当我使用便于ISWeb服务编写的便捷构造函数实例化其中一个类时,我的警告会弹出,因此在使用“InternetConnectionLost”类时,即使整个拥有“InternetConnectionLost”对象的类与之无关。 “ISWebservice”类,没有导入,方法被调用,没有什么,警告说:'ClassOwningInternetConnectionLost'没有实现'ISWebserviceDelegate'协议
我没有破坏任何东西,在运行时崩溃或对我造成任何伤害,但是当我接近释放时它已经开始让我烦恼。另外,因为几个类使用“initWithDelegate”构造函数命名,我在构建结果中有18个这样的警告,我不确定我是否做错了什么,在这种语言中相当新。
希望有人能对这个警告略微说明,谢谢:)
答案 0 :(得分:4)
这里的原因是项目中有多个接口,其函数定义为initWithDelegate:(id)。
Alloc只返回id,因此编译器不知道类型,因此它不知道正在使用哪个initWithDelegate,并且看似使用列表中的第一个。因此,你会得到一个毫无意义的警告。
然而,运行时知道对象的类型,因此没有任何问题。
解决方案似乎是使用更详细的init方法,例如。 initWithWebServiceDelegate。或者在alloc之后施放:
[(Foo *)[Foo alloc] initWithDelegate:self]
答案 1 :(得分:0)
您收到警告是因为编译器认为类已声明它们实现了ISWebserviceDelegate
协议。我怀疑它与intiWithDelegate
方法有什么关系,除非您继承该方法或者您在协议中定义了该方法,该协议本身是ISWebserviceDelegate
协议的扩展。
通常的原因是声明在超类中采用协议,然后忘记在后续子类的超类中实现。
如果您确定不是这种情况,那么您可能只需要清理项目并重建。你很有可能在某一点声明,然后声明,但编译器仍然停留在旧声明上。
如果清理无法解决,我会在ISWebserviceDelegate
上找一个项目,并确保它不会隐藏在某个地方。