我尝试比较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非常简单的人^^)
答案 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 Documentation和Difference between == and equals