Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa valueForKey:NSMutableDictionary是否对NSString使用copy?_Cocoa_Copy_Nsdictionary_Kvc - Fatal编程技术网

Cocoa valueForKey:NSMutableDictionary是否对NSString使用copy?

Cocoa valueForKey:NSMutableDictionary是否对NSString使用copy?,cocoa,copy,nsdictionary,kvc,Cocoa,Copy,Nsdictionary,Kvc,我有一个NSMutableDictionary,有十几个键,每个键都引用一个NSString值。如果我调用[myDictionary valueForKey:@“abc”]我将得到一个NSString对象 这是NSString复制的吗 由于没有@property声明,检索字符串会发生什么?我想我得到了一份。与NSMutableString有什么不同吗 我的目的是拥有一系列nsdictionary。我在数组上调用valueForKey,从字典集合中获取所有@“abc”键。因此,我现在有一个NSSt

我有一个
NSMutableDictionary
,有十几个键,每个键都引用一个
NSString
值。如果我调用
[myDictionary valueForKey:@“abc”]
我将得到一个
NSString
对象

这是
NSString
复制的吗

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

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


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

来自
-[NSDictionary valueForKey:][/code>的文档:

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


-[NSMutableDictionary setObject:forKey:][/code>的文档中:

如果字典中已经存在aKey,则另一个对象将取代它

valueForKey:
不复制对象<代码>设置对象:forKey:
替换对象,但不修改对象。如果你这样做

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

现在
a
@“klm”

的文档中的旧值
-[NSDictionary valueForKey:][/code>:

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


-[NSMutableDictionary setObject:forKey:][/code>的文档中:

如果字典中已经存在aKey,则另一个对象将取代它

valueForKey:
不复制对象<代码>设置对象:forKey:
替换对象,但不修改对象。如果你这样做

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

现在
a
是旧值
@“klm”

NSDictionary
键在设置时被复制。在code
dictionary[key]=value
中,复制
key
对象,并且dictionary保留副本。
对象未被复制;调用方和字典共享对同一对象的引用

检索键或对象时,不进行复制<代码>字典。allKeys
返回字典中键对象的数组,而不是副本。类似地,
dictionary[key]
返回对dictionary中
key
的值的引用

正如您所知,
@属性(copy)
仅在设置值时适用。ObjC getter从不复制对象,除非它是以这种方式专门记录的,或者您自己编写,这样它就可以复制对象


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

NSDictionary
键在设置时被复制。在code
dictionary[key]=value
中,复制
key
对象,并且dictionary保留副本。
对象未被复制;调用方和字典共享对同一对象的引用

检索键或对象时,不进行复制<代码>字典。allKeys
返回字典中键对象的数组,而不是副本。类似地,
dictionary[key]
返回对dictionary中
key
的值的引用

正如您所知,
@属性(copy)
仅在设置值时适用。ObjC getter从不复制对象,除非它是以这种方式专门记录的,或者您自己编写,这样它就可以复制对象

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