为什么Xcode认为我的变量在应该返回NSString时返回NSURL?

时间:2013-03-19 17:46:15

标签: ios objective-c xcode ios5 ios6

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

以下是相关代码:

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

我正在为Article对象的URL属性赋值。 self.articles数组仅用于保存Article对象。

在文章课中我有这个:

@property (nonatomic, strong) NSString *URL;

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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的方法的类,所以这必须存在于你正在使用的任何框架或类/库中并且它被调用。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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