【问题标题】:Would NSMutableArray -removeObject: also remove a NSString if it has a different memory adress?如果 NSMutableArray -removeObject: 具有不同的内存地址,也会删除 NSString 吗?
【发布时间】:2009-08-21 09:05:09
【问题描述】:

示例:我将一些 NSString 对象添加到 NSMutableArray: @"Foo", @"Bar", @“FooBar"。现在在其他地方我再次访问该数组,我想删除@"Foo"。所以我创建了一个新的NSString @"Foo",并将它传递给-removeObject:。该文档没有说明-removeObject 的工作条件。我认为它只查找内存地址,所以在这种情况下它什么也不做。对吗?

【问题讨论】:

    标签: iphone cocoa-touch uikit nsarray


    【解决方案1】:

    根据 removeObject 的文档:“匹配是根据对象对 isEqual: 消息的响应确定的”,并且将字符串与哈希值进行比较(“如果两个对象相等,则它们必须具有相同的哈希值”)所以,是的,那应该是不正确的。

    【讨论】:

    • +1。不过,您的意思一定是不正确的——请参阅有问题的最后一句话。
    【解决方案2】:

    您的示例是一个不幸的示例 - 如果您在代码中的两个位置使用字符串文字 @"Foo",编译器将为它们提供相同的地址(即它使用字符串的相同静态实例)。示例:

    heimdall:文件 leeg$ cat foostrings.m

    #import <Foundation/Foundation.h>
    
    int main(int argc, char **argv)
    {
        NSString *string1 = @"Foo";
        NSString *string2 = @"Foo";
        printf("string1: %p\nstring2: %p\n", string1, string2);
        return 0;
    }
    

    heimdall:文件 leeg$ ./foostrings

    字符串1:0x100001048

    字符串2:0x100001048

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2023-03-03
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      相关资源
      最近更新 更多