valueForKey:NSMutableDictionary是否使用NSStrings的副本?

时间:2018-05-05 03:54:28

标签: cocoa copy nsdictionary kvc

我有一个带有十几个键的NSMutableDictionary,每个键指的是NSString值。如果我拨打[myDictionary valueForKey:@"abc"],我会收到NSString个对象。

这是NSString被复制了吗?

由于没有@property声明,对此字符串的检索会发生什么?我想我得到了一份副本。与NSMutableString相比有什么不同吗?

我的目的是我有一个NSDictionaries数组。我在数组上调用valueForKey来获取字典集合中的所有@“abc”键。因此,我现在有一系列NSStrings。

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

2 个答案:

答案 0 :(得分:1)

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

  

如果key不以“@”开头,则调用objectForKey:。如果key以“@”开头,则删除“@”并使用其余键调用[super valueForKey:]。

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

  

如果字典中已存在aKey,则anObject取代它。

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

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

现在a是旧值@"klm"

答案 1 :(得分:1)

设置时会复制

NSDictionary个键。在代码dictionary[key] = value中复制key对象,字典保留副本。不复制value对象;调用者和字典共享对同一对象的引用。

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

您知道,@property (copy)仅在设置值时适用。 ObjC getters永远不会复制对象,除非它以这种方式具体记录,或者你自己编写,所以它就是这样。

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