2014-11-06 31 views
0

我要登录使用的WebView时产生一些错误。例如:比较的NSString VS的NSString * const的(在iOS8.1)失败

- (void)webView:(UIWebView *)aWebView didFailLoadWithError:(NSError *)error{ 
    NSString * domain; 
    domain = [error domain]; 
    NSLog(@"%@",error); 
    if (domain == NSURLErrorDomain) {NSLog(@"log me");} 
} 

我发现这在Xcode 6.1和iOS8.1模拟器上不起作用。 它曾用于以前的iOS版本(使用Xcode 6.1和iOS7模拟器进行测试)。 我错过了什么?

这里是控制台输出:

2014年11月6日03:42:15.295 MyApp的调试[21897:3606481]错误 域= NSURLErrorDomain代码= -1012“该操作不能 完成(NSURLErrorDomain错误-1012。)”的UserInfo = 0x7a7531c0 {NSErrorFailingURLKey = https://www.google.fr/}

而一些调试使用iOS8上的仿真器时:

(LLDB)p NSURLErrorDomain(无效*)
$ 0 = 0x0064dacc
(LLDB)PO域
NSURLErrorDomain

(LLDB)p域 (的NSString *)$ 2 = 0x0064dacc @ “NSURLErrorDomain”

回答

1

既然你比较字符串,你会想用isEqualToString:像这样:

if ([domain isEqualToString:NSURLErrorDomain]) {NSLog(@"log me");} 
+0

我的理解是,它应该也正常工作(比较指针)。 http://stackoverflow.com/questions/538996/constants-in-objective-c/539191#539191 – subzero 2014-11-06 03:10:17

+0

实际上,我在我的应用程序中遇到了同样的问题。以前它工作正常,但最近停止工作,并且'isEqualToString:'固定它,因为它显然是比较字符串的绝对方法。 “亚光”也给出了更详尽的解释。 – 2014-11-06 03:12:25

+0

我同意你和马特所说的。比较2个字符串必须用'isEqualToString'来完成。我在做'domain == NSURLErrorDomain'时的意图是比较指针。而且,根据LLDB的输出,他们指向相同的地址。对? – subzero 2014-11-06 03:27:20

3

只是为了扩大对亚伦的回答是:你在做什么总是错的,但它可能因为约的方式可可店串事故的工作。 domain == NSURLErrorDomain测试这些是否实际上是同一个对象。那么,也许在某些情况下他们是;可可有时可以通过将两个不同的实例(例如,文字@"howdy")当作对同一个对象的引用来有效地行为。但是,对于该行为,计数显然没有意义。这只是一个实现细节。

+0

即使两个字符串在理论上来自同一类的“相同”常量,在两个不同的模块中可能有两个常量副本。这种可能性仍然使得'=='更加脆弱。 – 2014-11-06 03:17:20