【问题标题】:Getting Xcode to drop "No XXX method found" warning when delegating委托时让 Xcode 放弃“未找到 XXX 方法”警告
【发布时间】:2012-01-24 10:59:00
【问题描述】:

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

我正在使用NSURLConnection 的应用程序中实现异步委托。一个对象包装NSURLConnection 并处理它的委托消息;效果很好。现在我在使用它的对象中定义我自己的委托(NSURLConnection 消息ConnectionWrapperConnectionWrapper 消息NeedsToUseConnection,你明白了),这同样有效,但是,Xcode 发出此警告:

找不到“-request:finishedWithResult”方法

这大概是因为我正在声明我正在调用的委托:

id<NSObject> delegate;

...Xcode 正在检查 NSObject 在 Foundation 框架中声明的内容。我的自定义委托消息不存在。我正在正确地隔离通话:

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

除了关闭警告(我喜欢尽可能多地打开警告)之外,是否有办法(通过语法或通过编译器指令)传达我知道此消息未声明的情况?相反,我是否应该为此 á la Java 使用接口设计模式?使用id&lt;WillReceiveRequestMessages&gt; 什么的?

欢迎提出建议。

【问题讨论】:

    标签: iphone objective-c cocoa-touch design-patterns


    【解决方案1】:

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

    @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];
    

    &lt;NSObject&gt; 语法在协议定义中很重要,因为它告诉编译器合并NSObject 协议。这就是你的协议如何获得像respondsToSelector: 这样的方法。如果你忽略它,编译器会开始抱怨respondsToSelector:

    【讨论】:

    • 谢谢。我刚刚看到了一个使用 UIAlertViewDelegate 的示例,这非常有帮助。
    【解决方案2】:

    这大概是因为我声明了我正在调用的委托 像这样: ...并且 Xcode 正在检查 NSObject 在 基础框架。

    这是不正确的。如果是这种情况,那么您将收到有关对象“可能不响应”该方法的警告,或类似的东西。这是一个完全独立的问题。

    这个警告是因为编译器必须知道选择器的签名才能调用它。这是因为,在幕后,编译器将方法调用转换为objc_msgSendobjc_msgSend_stret,具体取决于方法是否返回struct 类型。如果它不知道返回类型,它会猜测它不是struct,并使用第一个函数。但是,这可能是错误的。

    解决方案是在 anywhere 处声明该方法。它甚至不必在正确的类中声明。您可以在一些从未使用过的虚拟协议中声明它。只要在某处声明它,编译器就会知道并能够正确编译它。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多