两个NSString之间的平等?

时间:2012-12-17 18:31:03

标签: macos

  

可能重复:
  Compare 2 string in objective-C

我尝试比较2 NSString ...

之间的相等性

第一个存储在共享用户默认值中,第二个存储在用户通过NSTextField ...

这是我的一些代码(Xcode 4.5.2 Mac OS 10.7)......

AppDelegate.h:

@interface AppDelegate : NSObject <NSApplicationDelegate>{

    NSUserDefaults *administratifPref;

    ...

    IBOutlet NSTextField *champProtection;

    ...
}

...

- (IBAction)poursuivre:(id) sender;

...

@end

这里是AppDelegate.m:

- (IBAction)poursuivre:(id)sender {

if([champProtection stringValue] == [champProtection stringValue]){
    ...
    ...
    }

}

我的问题是:为什么条件“如果”永远不会验证?!

我没有任何问题,没有崩溃...

我添加了2个NSLog:

- (IBAction)poursuivre:(id)sender {


NSLog([champProtection stringValue]);
NSLog([administratifPref valueForKey:@"motdepasse"]);


if([champProtection stringValue] == [champProtection stringValue]){
    ...
    ...
    }

}

并且返回值 相同:(

我找到的唯一解决方案是:

- (IBAction)poursuivre:(id)sender {

BOOL result = [[champProtection stringValue] isEqualToString:[administratifPref valueForKey:@"motdepasse"]];
if(result == YES) {
    ...
    ...
    }

}

所以...... 任何人都可以解释我这两种编码方式之间的区别,这似乎是太不同了吗? (但对于像我这样的新人而言,这似乎是相同的,他们相信那些说Cocoa非常简单的人^^)

4 个答案:

答案 0 :(得分:2)

==运算符正在比较对象的指针地址(它们是不同的,因为你有两个对象。每个对象都分配了自己的内存空间,因此它们有不同的指针地址),而isEqualToString正在比较内容内存缓冲区(即字符串本身)

答案 1 :(得分:2)

[champProtection stringValue] == [champProtection stringValue]

在这里,您要与他们的地址进行比较。

[[champProtection stringValue] isEqualToString:[administratifPref valueForKey:@"motdepasse"]];

它正在比较真实的字符串内容。

答案 2 :(得分:1)

Objective-C是C的严格超集。它通过将对象放在不透明指针后面来添加对象 - 所有Objective-C对象声明中的星号(除了typedef)意味着你持有的实际内容是指针到一个对象,即它在内存中的地址,而不是对象本身。

当你对两个指针执行==时,你会问他们是否都引用了内存中的相同位置?&#39;。如果他们这样做,则两者都引用相同的对象,因此在其他属性中,两个指针都引用相同值的内容。

当您使用isEqual:(或其中一个更具体的兄弟姐妹)时,您会询问这两个对象是否具有相同的价值?&#39;,这是完全不同的事情在语义上。

所以这两件事情是完全不同的,在你的情况下你对你想要的行为的描述意味着你想要使用后者。

答案 3 :(得分:1)

要比较两个字符串,您必须使用以下代码:

if([name1 isEqualToString:name2]){
    NSLog("These are the same name");
}

您可以看到更多on Apple DocumentationDifference between == and equals