Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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
Objective c NSMutableDictionary和mutableCopy_Objective C_Nsmutabledictionary_Mutability - Fatal编程技术网

Objective c NSMutableDictionary和mutableCopy

Objective c NSMutableDictionary和mutableCopy,objective-c,nsmutabledictionary,mutability,Objective C,Nsmutabledictionary,Mutability,我被下面的代码弄糊涂了。在我添加mutableCopy行之前,它不起作用。在我添加了这行之后,它成功了 为什么一开始aDict不可变?我宣布aDict为NSMUTABLE字典 - (void) myRoutine: (NSMutableDictionary *) dictOfDicts { NSMutableDictionary * aDict = dictOfDicts[dictOfDictsKey]; int data = [aDict

我被下面的代码弄糊涂了。在我添加mutableCopy行之前,它不起作用。在我添加了这行之后,它成功了

为什么一开始aDict不可变?我宣布aDict为NSMUTABLE字典

- (void) myRoutine: (NSMutableDictionary *) dictOfDicts
   {
   NSMutableDictionary * aDict = dictOfDicts[dictOfDictsKey];
   int                   data  = [aDict[aDictKey] intValue];

   aDict           = [aDict mutableCopy];
   aDict[aDictKey] = @(++data);
   }

dictOfDicts
的声明称它是指向可变字典的指针。但是,它不使用Objective-C泛型语法来说明键或值的类型。因此,我们(和编译器)最多可以假设键是
id
,值是
id
,这是完全通用的对象指针

然后使用从
dictOfDicts
获取的值初始化
aDict
变量。您已经声明,
aDict
也是指向可变字典的指针。这是它的“静态类型”,但它指向的对象的真实类型在运行时由该键下的
dictOfDicts
中保存的任何对象确定。它可能是一本易变的字典,也可能是其他东西。它只编译find,因为编译器不知道该值是什么类型的对象

但是,对象的实际类型(也称为“动态类型”)控制哪些操作成功或失败/崩溃/其他操作。在你的例子中,它听起来像是一本不变的字典。所以,当你试图对它进行变异时,“它不起作用”(你没有具体说明实际发生了什么)

你制作了一个可变副本,你可以对它进行变异。然而,现在这是一个独立的对象,
中的对象记录了文档。所以,你没有改变你认为你是什么


解决方案是首先将可变字典放入
dictOfDicts
。或者,更好的是,将您自己设计的自定义类的对象放入其中,并对真实属性进行操作。

变量类型与对象的实际类型无关。谢谢。那么,你是说如果我创建一个可变类型的变量,它不是可变变量?我还是很困惑。aDict是指向NSMutableDictionary的指针。但是字典本身是不可变的?和[aDict mutableCopy];让它变了?