使用isEqualToString的NSString setter

时间:2009-11-12 03:57:29

标签: objective-c string

在实用核心数据手册中,我遇到了NSString二传手的代码段:

- (void)setMyString:(NSString*)string; 
{
    @synchronized(self) { 
        if ([string isEqualToString:myString]) return; 
        [myString release]; 
        myString = [string retain]; 
    } 
} 

有没有理由在这里使用[string isEqualToString:myString]代替string == myString?这不是说如果两个字符串具有相同的内容,结果将不同于它们实际上是同一个对象吗?这有关系吗?

感谢。

1 个答案:

答案 0 :(得分:5)

请注意,您要比较的变量是指向NSStrings的指针。指针比较只检查指针是否指向相同的地址。它最后对内容一无所知。两个不同位置的两个字符串对象可以具有相同的内容。因此,您需要isEqualToString:。在这种情况下,我不确定这是一个非常重要的区别。如果它是特殊的套管,根据新字符串是否真的会发生变化而发出更改通知,那对我来说会更有意义。

顺便提一下,在NSString setter中,您几乎总是想要copy而不是retain。我不知道本书中的确切用例,但是如果你只保留字符串并且它恰好是可变的,它可能会在你的背后发生变化并导致奇怪的结果。如果字符串不可变,copy只是retain的别名。