3

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

这是有问题的代码:

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

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

在文章类中,我有这个:

@property (nonatomic, strong) NSString *URL;

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

4

6 回答 6

5

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

在Matt Gallagher撰写的 Objective-C 的弱类型中的大弱点一文中有关于这个问题的更多信息。

于 2013-03-19T17:54:05.210 回答
0
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,因此它必须存在于您正在使用的任何框架或类/库中并且它被调用。

于 2013-03-19T17:56:29.637 回答
0

重构代码以避免混淆:

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

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

于 2013-03-19T17:58:11.593 回答
0

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

于 2013-06-04T17:31:58.150 回答
0

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

cell.articleURL.text = [(Article *) self.articles[row] URL];
于 2013-03-19T17:58:54.340 回答
0

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

IE

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

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

于 2013-03-19T17:59:54.150 回答