代码之家  ›  专栏  ›  技术社区  ›  RickiG

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

  •  0
  • RickiG  · 技术社区  · 15 年前

    这不是一个实际的Xcode错误消息,它是一个一直困扰我的警告 很长时间了。我找不到移除它的方法,我想我可能超越了一些不成文的命名约定规则。

    如果我构建一个类,通常是扩展nsObject,它的唯一目的是在有数据时完成一些任务并返回报告,那么我经常给它一个方便的构造函数,比如“initwitdelegate”。

    我在当前项目中第一次这样做是为了一个叫做 ISWebservice 协议如下:

    @protocol ISWebserviceDelegate
    
    @optional
    
    - (void) serviceFailed:(NSError*) error;
    - (void) serviceSuccess:(NSArray*) data;
    
    @required
    
    @end
    

    在我的iswebservice.h接口中声明,就在import语句的正下方。

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

    现在,每当我用比ISWebService更晚的便利构造函数实例化这些类中的一个时,就会弹出警告,因此当使用“InternetConnectionLost”类时,即使拥有“InternetConnectionLost”对象的整个类与“ISWebServer”无关ICE“类,没有导入,正在调用方法,没有任何内容,警告如下: “ClassOwningInternetConnectionLost”不实现“IsWebServiceDelegate”协议

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

    希望有人能对这一警告有所了解,谢谢:)

    2 回复  |  直到 14 年前
        1
  •  0
  •   TechZen    15 年前

    因为编译器认为类已经声明它们实现了 ISWebserviceDelegate 协议。我怀疑这和 intiWithDelegate 方法,除非您继承了该方法,或者您在协议中定义了该方法本身是 ISWebServiceDelegate 协议。

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

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

    如果清洁不能解决,我会做一个项目 ISWebServiceDelegate 一定不要把它藏在什么地方。

        2
  •  4
  •   mxcl    14 年前

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

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

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

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

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