2009-11-23 98 views
2

我有两个NSString的具有相同值NS字符串比较失败,stringWithFormat

这个失败对我来说:

if (button.controlName == controlName) { 
     return button; 
    } 

这工作:

if ([button.controlName compare: controlName] == NSOrderedSame) { 
     return button; 
    } 

这是字符串只是如何比较在目标c?或者第一个陈述应该如何运作?为什么第一个陈述失败了?我知道它适用于其他字符串。

它不会像这样被初始化的工作字符串:

button.controlName = [NSString stringWithFormat:@"controlName%d", i] 
+0

它没有为其他字符串工作,它似乎只工作。即使在C中,你也不能用==比较两个字符串(并且必须使用strcmp或类似的)。 – bbum 2009-11-23 17:46:45

回答

9

用的NSString你应该使用isEqualToString:而不是比较。

[button.controlName isEqualToString:controlName] 

了解更多的原因(以及为什么它的工作对一些其他的字符串)

目的-C是在标准C的顶部结果OBJ-C相当薄层,只是和普通的c一样,没有运算符重载。

NSString *controlName = @"bobDole"; 

上面的代码创建了一个指向字符串@"bobDole",控件名称是不是本身的价值,而是真的只是一个长整型,上面写着一个对象的内存地址。

当使用指针和使用==操作者等(正在使用mutableCopy防止优化出本实施例的有效性的编译器。)

NSString *string1 = @"bobDole"; 
NSString *string2 = [string1 mutableCopy]; 

NSLog(@"%d", string1 == string2); 

上面的代码将总是打印假比较它们(或在这种情况下为零),尽管两个对象都是NSString,并且都包含@“bobDole”的值。这是因为string1的值实际上是一个十六进制数字,例如0x,而string2可能类似于0x0987654。因此,其实上面的比较是这样的计算机:

NSLog(@"%d", 0x== 0x0987654); 

所以当比较字符串(或其它任何物体),一直使用的isEqual方法之一,从来没有使用==操作。

现在,为什么它的工作对其他一些字符串:

由于使用==操作,当你实际做指针比较如上所述。您还会注意到我在上面的例子中,我使用mutableCopy不要使用以下:

NSString *string1 = @"bobDole"; 
NSString *string2 = @"bobDole"; 

我这样做的原因是,编译器将着眼于这两个语句知道它们共享相同的不可变的值并对其进行优化等等他们在内存中指向相同的价值。从而使两者的指针值相同。

编译器还对这些字符串初始化方法进行了相同的优化。

NSString *string3 = [NSString stringWithString:@"bobDole"]; 
NSString *string4 = [NSString stringWithString:string1]; 
NSString *string5 = [string1 copy]; 

由于这种优化由编译器和运行时所有5个指针指向相同的存储器位置,并且因此彼此相等时经由==相比的。

这可能有点长,但我试图使其易于理解。希望能帮助到你。

1

有一种方法称为isEqualToString来比较两个NSStrings。

if([button.controlName isEqualToString:controlName]) 
    ... 
2

1日声明只是比较指针,而不是字符串值,所以比较字符串,你应该使用-isEqualToString作为布赖恩点。

相关问题