NSMutableDictionary中的更改未反映在父NSDictionary中

时间:2017-08-02 21:31:22

标签: ios objective-c json

问题1)

我正在使用以下代码从NSDictionary创建NSMutableDictionary:

_allKeysDictionary = [receivedDictionary mutableCopy];

我正在使用以下代码更新 _allKeysDictionary 中的值:

[_allKeysDictionary setObject:[textField text] forKey:@"field"];

receivedDictionary 的我的父NSDictionary未反映 _allKeysDictionary 中所做的更改。

我需要更新receivedDictionary的值。

问题2)

我正在使用

(__bridge CFMutableDictionaryRef)

在我的JSON响应中保留指向NSDictionary之一的指针。但是当我试图重新获得上述CFMutableDictionaryRef时,我仍然得到NSDictionary。我不知道出了什么问题。我使用以下代码从参考

重新获得字典
NSMutableDictionary *getPointedDict = (__bridge NSMutableDictionary*) dataRefValue;

3 个答案:

答案 0 :(得分:2)

Q1:但方法mutableCopy甚至这样说:创建副本! receivedDictionary逻辑上不会改变。

更新(完成后):

receivedDictionary = _allKeysDictionary;

或者确保以后不能进行任何更改:

receivedDictionary = [NSDictionary dictionaryWithDictionary: _allKeysDictionary];

顺便说一下,你可以写:

_allKeysDictionary[@"field"] = textField.text;

Q2:在Obj-C(和许多其他语言)中,强制转换不会改变对象的结构。如果是NSDictionary,它将始终保持NSDictionary。所以实际的强制转换会起作用(即编译器不会告诉你),但是一旦你开始使用原始类中没有实现的对象,你的应用程序就会崩溃,或者你会得到其他未定义的结果。

答案 1 :(得分:0)

  

但我NSDictionary的父receivedDictionary未反映_allKeysDictionary

中所做的更改

当然他们不是,你做了mutableCopy - 这是副本。你现在有两个具有相同键和值的词典。

  

我需要更新receivedDictionary的值

如果是NSDictionary,则无法执行此操作,这就是 immutable 的含义。你可以receivedDictionary中存储的引用替换为引用你的新可变字典(或它的不可变副本)的引用,但这不能做你希望你有其他变量存储的内容引用原始字典。

但是,如果字典中的值本身是可变的,那么您可以更改这些值。例如。如果NSDictionary包含NSMutableArray值,则可以更改这些数组的元素,但不能更改哪个数组与字典中的哪个键相关联。

Q2:您不能简单地将对不可变字典的引用转换为可变字典。无论如何,强制转换都不会更改引用的对象,它只会更改编译器将其视为的类型(如果类型与程序中断的实际类型不兼容)。

看起来你不确定对象,引用和可变性;可能是时候做一些学习了。

HTH

答案 2 :(得分:0)

  1. MutableCopy&复制两者都在NSDictionary上做深拷贝。唯一的区别是mutableCopy使你的新词典变得可变。
  2. 当您进行深层复制时,您正在复制值,而不是参考,这意味着您在新词典中所做的任何事情都不会影响旧值。
  3. 另外,你的原始字典是不可变的,即使你复制了引用,它的价值也不会改变。