关于“initWithDelegate”的持久警告消息!

时间:2010-04-17 12:03:00

标签: cocoa-touch xcode delegates naming-conventions

这不是一个真正的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个这样的警告,我不确定我是否做错了什么,在这种语言中相当新。

希望有人能对这个警告略微说明,谢谢:)

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:0)

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

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

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

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