【问题标题】:Persistent warning message about "initWithDelegate"!关于“initWithDelegate”的持续警告消息!
【发布时间】:2010-04-17 12:03:00
【问题描述】:

这不是实际的 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 个这样的警告,而且我不确定我是否做错了什么,因为在这种语言方面相当新。

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

【问题讨论】:

    标签: cocoa-touch xcode delegates naming-conventions


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 不幸的是,Cocoa 中的约定导致:- (id)initWithDelegate+ (id)webServiceWithDelegate,因为就编译器而言,后者不需要命名空间,而前者则需要。
    【解决方案2】:

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

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

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

    如果清理没有解决,我会在ISWebserviceDelegate 上找到一个项目,并确保它没有藏在某个地方。

    【讨论】:

    • 您好 TechZen。感谢您的建议,它们都很好,我通过了它们但仍然没有运气。该警告已经存在了一个多月的发展,因此在此期间已经完成了许多“清除所有目标”。我确保没有带有实现 ISWebserviceDelegate 警告的类,并且所有类都扩展了 NSObject、UIViewController 或 UIView。
    • 嗯,唯一剩下的就是一个类别,可能在 NSObject 上。可能在自定义构建脚本或其他东西中。我认为它只适用于这个项目?如果没有,那么您可能在某处有损坏的 Xcode 首选项
    • 您可能会让其他人查看您的代码。当我们每天盯着它看时,一双新鲜的眼睛经常会看到我们看不到的东西。
    • 我已经通过了项目中的所有类别,没有运气。当你写它时,我确信那将是引用隐藏的地方。我想我将不得不花几个小时在这个问题上,确保我在整个层次结构中一直调查你的建议。我很确定你回答了这个问题,但我还没有找到它适用的确切行:) 再次感谢“新鲜的眼睛”。
    猜你喜欢
    • 2019-08-07
    • 2021-12-08
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多