【问题标题】:Why is Xcode thinking my variable is returning an NSURL when it should be returning an NSString?为什么 Xcode 认为我的变量在应该返回 NSString 时却返回了 NSURL?
【发布时间】:2013-03-19 17:46:14
【问题描述】:

我收到以下警告:“从 NSURL 分配 NSString 的指针类型不兼容”。

这是有问题的代码:

cell.articleURL.text = [self.articles[row] URL];

我正在为 Article 对象的 URL 属性值分配一个标签。 self.articles 数组仅用于保存 Article 对象。

在文章类中我有这个:

@property (nonatomic, strong) NSString *URL;

为什么它认为它是一个 NSURL?

【问题讨论】:

  • 你有没有一个叫做 URL 的方法,它返回 NSURL?
  • 好吧,这只是self.articles[row].URL 的长手,但由于self.articles[row] 返回一个ID,我不得不使用该方法。我猜是get方法。
  • 您可以将self.articles[row] 的输出转换为正确的类,然后编译器就会对任一表示法感到满意。
  • 但是我还是想知道,方法URL是从哪里调用的,因为他没有那个方法,cocoa/touch框架也没有

标签: ios objective-c xcode ios5 ios6


【解决方案1】:

问题在于self.articles[row] 将返回一个id 类型的对象,这意味着Objective-C 运行时无法确定应用哪个方法实现。它在另一个接口中找到URL 方法并使用该方法。

在 Matt Gallagher 的文章 A big weakness in Objective-C's weak typing 中有更多关于这个问题的信息。

【讨论】:

    【解决方案2】:

    重构您的代码以避免混淆:

    Article *article = self.articles[0];
    cell.articleURL.text = article.URL;
    

    正如 Jim 所说,编译器正在为 id 对象找到错误的 URL 方法。通过拆分代码,您可以避免这个问题。

    【讨论】:

      【解决方案3】:

      您的代码不知道数组的返回类型,因此猜测您可能从哪个类调用哪个方法。你需要像这样添加一个强制转换,它可以让编译器准确地知道期望哪个类:

      cell.articleURL.text = [(Article *) self.articles[row] URL];
      

      【讨论】:

        【解决方案4】:

        添加到@Jim 答案。您需要将[self.articles[row]] 的结果转换为声明@property (nonatomic, strong) NSString *URL; 的正确类。因此,Objective-C 运行时可以确定可以应用哪种方法实现。

        [(Article *)[self.articles[row]] URL]
        

        或者将其存储在Article 类型的变量中,然后在该对象上调用 URL。

        【讨论】:

          【解决方案5】:
          cell.articleURL.text = [self.articles[row] URL];
          

          正如你所说的self.articles[row] 返回id,所以你需要强制它的类型是Article

          cell.articleURL.text = [(Article *)self.articles[row] URL];
          

          你有一个名为 URL 的方法被self.articles[row] 返回的对象调用,它的返回类型是NSURL

          由于我找不到任何具有名为 URL 的方法的类,因此它必须存在于您正在使用的任何框架或类/库中并且它正在被调用。

          【讨论】:

            【解决方案6】:

            当您创建 NSMutableArray 时,编译器不知道您将存储哪种类型的对象。它是动态决定的。因此,当您尝试从以下位置获取 URL [self.articles[row] URL]; 编译器将其视为 id 类型。所以你必须使用类型转换cell.articleURL.text = [(Article *) self.articles[row] URL];

            【讨论】:

              猜你喜欢
              • 2014-10-11
              • 1970-01-01
              • 2015-04-05
              • 1970-01-01
              • 2015-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-05
              相关资源
              最近更新 更多