2010-01-17 12 views
0

我无法破译“路过的说法......从不同的Objective-C型警告”。帮助破译一个NSString“路过的说法......从不同的Objective-C型警告”

我有一个常量字符串声明为:

extern NSString * const URL_1; 

,并定义为:

NSString * const URL_1 = @"http://someurl"; 

如果我,说,转让的是恒定的,以一个NSString如下:

NSString *URL = nil; 
... 
URL = [[NSString alloc] initWithString:URL_1]; 

并将此NSString作为参数传递给期望NSString的函数:

ViewController *viewController = [[ViewController alloc] initWithURL:URL]; 

功能签名:

- (id)initWithURL:(NSString *)URL 

我接收我是一个警告“传递‘initWithURL’的参数1:从不同的目标C型”

据我所知NSString对象是创建后不可变,并且在创建时将值赋给字符串,所以我不明白为什么URL_1的常量性质会导致问题。

我相信我在这里是甜甜圈和忽略了简单的东西!请有人帮我解决这个警告?提前谢谢了!

+1

我敢肯定,去掉“常量”会杀了这个问题,但还不足以发布它作为一个答案。 – zneak 2010-01-17 20:09:11

+0

是的,我也会这么想,但似乎没有什么区别。 – 2010-01-17 20:12:17

+0

你确定没问题,你的initWithURL:方法接受一个字符串而不是NSURL? – zneak 2010-01-17 20:15:18

回答

2

有系统框架许多方法声明为:

- (id)initWithURL:(NSURL *)anURL; 

,当然,+alloc被声明为:

- (id) alloc; 

因此,当编译器看到:

ViewController *viewController = [[ViewController alloc] initWithURL:URL]; 

分配的返回类型是id和补偿梅勒很可能会看到上述声明并导致警告。现在,一般来说,编译器还会警告它为选择器找到了多个签名 - 该特定方法名称的多个签名。

如果它不是,它很可能是因为您尚未导入ViewController.h到包含上面的代码行的文件。

总之,不声明具有相同名称为采用了一种不同类型参数的另一方法的方法。

+0

非常感谢,我应该通过显示函数调用的颜色来发现它。 将函数调用和变量名更改为initWithSourceURL和sourceURL分别解决了警告。 – 2010-01-17 20:34:10

+0

非常好。我还建议将方法改为'initWithSourceURLString:'作为结尾w/URL通常意味着参数是NSURL * – bbum 2010-01-17 22:12:15