比较NSString与NSString*const(在iOS8.1上)失败

比较NSString与NSString*const(在iOS8.1上)失败,ios,objective-c,xcode,ios8.1,Ios,Objective C,Xcode,Ios8.1,我想记录使用WebView时产生的一些错误。例如: - (void)webView:(UIWebView *)aWebView didFailLoadWithError:(NSError *)error{ NSString * domain; domain = [error domain]; NSLog(@"%@",error); if ( domain == NSURLErrorDomain ) {NSLog(@"log me");} } 我发现这在Xcod

我想记录使用WebView时产生的一些错误。例如:

- (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-simulator上不起作用。 它曾经在以前的iOS版本上工作(使用Xcode 6.1和iOS7模拟器进行测试)。 我错过了什么?

以下是控制台输出:

2014-11-06 03:42:15.295 MyApp调试[21897:3606481]错误 Domain=nsurErrorDomain Code=-1012“无法执行该操作 已完成。(NSURlerDomain错误-1012。)“UserInfo=0x7a7531c0 {NSErrorFailingURLKey=}

以及使用iOS8模拟器时的一些调试:

(lldb)p NSURLErrorDomain(无效*)
$0=0x0064dacc
(lldb)po域
NSURLErrorDomain

(lldb)p域 (NSString*)$2=0x0064dacc@“NSURlerErrorDomain”


因为要比较字符串,所以需要使用
isEqualToString:
如下所示:

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

因为要比较字符串,所以需要使用
isEqualToString:
如下所示:

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

我想进一步阐述一下亚伦的回答:你所做的总是错的,但这可能是因为可可储存琴弦的方式出了意外
domain==nsurErrorDomain
测试这些对象是否有效地是同一个对象。嗯,也许在某些情况下他们是;Cocoa有时可以通过将两个不同的实例(例如,literal
@“howdy”
)视为对同一个对象的引用来高效地工作。但显然,指望这种行为是没有意义的。这只是一个实现细节。

只是对Aaron的回答进行扩展:您所做的总是错误的,但可能是因为Cocoa存储字符串的方式发生了意外
domain==nsurErrorDomain
测试这些对象是否有效地是同一个对象。嗯,也许在某些情况下他们是;Cocoa有时可以通过将两个不同的实例(例如,literal
@“howdy”
)视为对同一个对象的引用来高效地工作。但显然,指望这种行为是没有意义的。这只是一个实现细节。

我的理解是它也应该工作(比较指针)。事实上,我的应用程序中也有同样的问题。以前它工作正常,但最近停止工作,
isEqualToString:
修复了它,因为(显然)它是比较字符串的可靠方法<代码>马特也做了更透彻的解释。我同意你和马特所说的。必须使用“isEqualToString”比较两个字符串。我在执行'domain==NSURLErrorDomain'时的目的是比较指针。并且,根据LLDB输出,它们指向相同的地址。对吗?我的理解是它也应该工作(比较指针)。事实上,我的应用程序中也有同样的问题。以前它工作正常,但最近停止工作,
isEqualToString:
修复了它,因为(显然)它是比较字符串的可靠方法<代码>马特也做了更透彻的解释。我同意你和马特所说的。必须使用“isEqualToString”比较两个字符串。我在执行'domain==NSURLErrorDomain'时的目的是比较指针。并且,根据LLDB输出,它们指向相同的地址。对吗?即使理论上两个字符串都是来自同一个类的“相同”常量,在两个不同的模块中也可能有该常量的两个副本。这种可能性使得
==
的使用更加脆弱。即使两个字符串在理论上是来自同一类的“相同”常量,在两个不同的模块中也可能有两个常量的副本。这种可能性使得
==
的使用更加脆弱。