【问题标题】:Does valueForKey: NSMutableDictionary use copy for NSStrings?valueForKey: NSMutableDictionary 是否使用 NSStrings 的副本?
【发布时间】:2018-05-05 03:54:27
【问题描述】:

我有一个带有十几个键的NSMutableDictionary,每个键都指向一个NSString 值。如果我调用[myDictionary valueForKey:@"abc"],我会得到一个NSString 对象。

这是NSString 复制的吗?

由于没有@property 声明,这个字符串的检索会发生什么?我假设我得到了一份副本。 NSMutableString 有什么不同吗?

我的目的是我有一个NSDictionaries 数组。我在数组上调用valueForKey 以从字典集合中获取所有@"abc" 键。因此我现在有一个 NSStrings 数组。

我需要将该数组传递给后台线程上的NSOperation。因此,NSStrings 需要复制,以便以后修改字典不会导致传递给 NSOperation 的字典发生变化。

【问题讨论】:

    标签: cocoa copy nsdictionary kvc


    【解决方案1】:

    来自-[NSDictionary valueForKey:]的文档:

    如果 key 不以“@”开头,则调用 objectForKey:。如果键确实以“@”开头,则去掉“@”并使用键的其余部分调用 [super valueForKey:]。

    来自-[NSMutableDictionary setObject:forKey:]的文档:

    如果字典中已经存在aKey,则使用一个Object。

    valueForKey: 执行 objectForKey: 并且不复制对象。 setObject:forKey: 替换对象,它不修改对象。如果你这样做了

    [mutableDictionary setObject:@"klm" forKey:@"abc"];
    a = [mutableDictionary valueForKey:@"abc"];
    [mutableDictionary setObject:@"xyz" forKey:@"abc"];
    

    现在a 是旧值@"klm"

    【讨论】:

      【解决方案2】:

      NSDictionary 键在设置时被复制。在代码dictionary[key] = value 中复制了key 对象,并且字典保留了该副本。 value 对象没有被复制;调用者和字典共享对同一个对象的引用。

      检索键或对象时,没有复制。 dictionary.allKeys 返回字典中键对象的数组,而不是副本。同样,dictionary[key] 返回对字典中key 值的引用。

      您知道,@property (copy) 仅在设置值时适用。 ObjC getter 从不复制对象,除非以这种方式专门记录了它,或者您自己编写了它。

      同样,为了解决您的问题,键值方法对该属性使用相同的底层规则。因此-setValue:forKey:-setValue:forKeyPath:-valueForKey:-valueForKeyPath: 等将获取或设置正确的值,就像您直接访问该属性一样。换句话说,如果在设置属性时复制了值,-setValue:forKeyPath: 将复制该值。如果访问器不复制该值,则-valueForKey: 将不会复制该值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多