代码之家  ›  专栏  ›  技术社区  ›  Jed Smith

委派时让xcode删除“找不到xxx方法”警告

  •  5
  • Jed Smith  · 技术社区  · 15 年前

    这可能是我做错了设计模式。

    我在一个使用 NSURLConnection . 一个对象将 NSURLConnection公司 并处理其委托的消息;这很好。现在我在使用它的对象中定义自己的委托( NSURLConnection公司 信息 ConnectionWrapper , 连接包装器 信息 NeedsToUseConnection ,您得到了这个想法),这也很有效,但是,xcode发出以下警告:

    没有找到'-request:finishedWithResult'方法

    这大概是因为我这样声明我要调用的委托:

    id<NSObject> delegate;
    

    …Xcode正在检查 NSObject 在基础框架中声明。我的自定义委托消息不存在。我正在适当地隔离通话:

    if([delegate respondsToSelector:@selector(request:finishedWithResult:)])
        [delegate request:self finishedWithResult:ret];
    

    除了关闭警告(我喜欢尽可能多地打开警告)之外,还有没有一种方法(语法上或通过编译器指令)可以让我意识到此消息是未声明的?相反,我应该使用这个La Java的接口设计模式吗?使用 id<WillReceiveRequestMessages> 还是什么?

    接受建议。

    2 回复  |  直到 13 年前
        1
  •  10
  •   Alex    15 年前

    更好的方法是创建自己的委托协议:

    @protocol MyControlDelegate <NSObject>
    
    @optional
    - (void)request:(MyControl *)request didFinishWithResult:(id)result;
    
    @end
    

    然后,您可以这样声明您的委托:

    id <MyControlDelegate> delegate;
    

    当您编写以下代码时,编译器将不再抱怨:

    if ([delegate respondsToSelector:@selector(request:didFinishWithResult:)])
        [delegate request:self didFinishWithResult:result];
    

    这个 <NSObject> 语法在协议定义中很重要,因为它告诉编译器将 NSObject 协议。这就是你的协议得到的方法 respondsToSelector: . 如果你忽略了这一点,编译器就会开始抱怨 响应选择器: 相反。

        2
  •  0
  •   user102008    13 年前

    这大概是因为我正在声明我要调用的委托 就像这样:…xcode正在检查nsobject在 基础框架。

    这是不正确的。如果是这样的话,你会得到一个关于对象“可能没有响应”方法的警告,或者类似的东西。这是一个完全不同的问题。

    此警告是因为编译器必须知道选择器的签名才能调用它。这是因为,在幕后,编译器将方法调用转换为 objc_msgSend objc_msgSend_stret 取决于方法是否返回 struct 输入或不输入。如果它不知道返回类型,它将猜测它不是 结构 ,并使用第一个函数。然而,这可能是错误的。

    解决方法是声明方法 在任何地方 完全。它甚至不必在正确的类中声明。你可以在一些从未使用过的虚拟协议中声明它。只要它被宣布 在某处 ,编译器将知道并能够正确编译它。