问题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;
答案 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)