使用isEqualToString的NSString setter

nev*_*ing 1 string objective-c

在Pragmatic Core Data一书中,我遇到了一个NSStringsetter的代码片段:

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

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

谢谢.

Chu*_*uck 5

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

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