代码之家  ›  专栏  ›  技术社区  ›  nevan king

使用isEqualToString的nsString setter

  •  1
  • nevan king  · 技术社区  · 15 年前

    在实用核心数据手册中,我遇到了 NSString 设定者:

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

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

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Chuck    15 年前

    请注意,要比较的变量是指向nsstring的指针。指针比较只检查指针是否引用相同的地址。它对结尾的内容一无所知。两个不同位置的两个字符串对象可以具有相同的内容。因此你需要 isEqualToString: . 在这种情况下,我也不确定这是否是一个非常重要的区别。如果它是特殊的大小写,根据新字符串是否真的是一个更改发送更改通知,那么对我来说就更有意义了。

    顺便说一下,在nsstring setter中,您几乎总是希望 copy 而不是 retain . 我不知道这本书中的具体用例,但是如果你保留了字符串,它恰好是可变的,它会在你的背后发生变化,并导致奇怪的结果。如果字符串不是可变的, 复制 只是一个别名 保持 .