-1

可能重复:
比较objective-C中的2个字符串

我尝试比较 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

4 回答 4

2

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

于 2012-12-17T18:33:45.300 回答
2
[champProtection stringValue] == [champProtection stringValue]

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

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

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

于 2012-12-17T18:35:26.697 回答
1

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

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

您可以在 Apple 文档和此处查看更多信息== 和 equals 之间的区别

于 2012-12-17T18:40:29.523 回答
1

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

当您==在两个指针上执行时,您会问“它们是否都引用了内存中的相同位置?”。如果它们这样做,那么它们都引用同一个对象,因此在其他属性中,两个指针都引用了相同值的东西。

当您使用isEqual:(或其更具体的兄弟姐妹之一)时,您会问“无论它们的位置如何,这两个对象是否具有相同的值?”,这在语义上是完全不同的事情。

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

于 2012-12-17T18:38:55.360 回答