在实用核心数据手册中,我遇到了NSString
二传手的代码段:
- (void)setMyString:(NSString*)string;
{
@synchronized(self) {
if ([string isEqualToString:myString]) return;
[myString release];
myString = [string retain];
}
}
有没有理由在这里使用[string isEqualToString:myString]
代替string == myString
?这不是说如果两个字符串具有相同的内容,结果将不同于它们实际上是同一个对象吗?这有关系吗?
感谢。
答案 0 :(得分:5)
请注意,您要比较的变量是指向NSStrings的指针。指针比较只检查指针是否指向相同的地址。它最后对内容一无所知。两个不同位置的两个字符串对象可以具有相同的内容。因此,您需要isEqualToString:
。在这种情况下,我不确定这是一个非常重要的区别。如果它是特殊的套管,根据新字符串是否真的会发生变化而发出更改通知,那对我来说会更有意义。
顺便提一下,在NSString setter中,您几乎总是想要copy
而不是retain
。我不知道本书中的确切用例,但是如果你只保留字符串并且它恰好是可变的,它可能会在你的背后发生变化并导致奇怪的结果。如果字符串不可变,copy
只是retain
的别名。