我有一个带有十几个键的NSMutableDictionary
,每个键指的是NSString
值。如果我拨打[myDictionary valueForKey:@"abc"]
,我会收到NSString
个对象。
这是NSString
被复制了吗?
由于没有@property
声明,对此字符串的检索会发生什么?我想我得到了一份副本。与NSMutableString
相比有什么不同吗?
我的目的是我有一个NSDictionaries
数组。我在数组上调用valueForKey
来获取字典集合中的所有@“abc”键。因此,我现在有一系列NSStrings。
我需要将该数组传递给后台线程上的NSOperation
。因此,NSStrings
需要复制,以便稍后修改字典不会导致传递给NSOperation
的字典发生更改。
答案 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:
将不会复制该值。