何时以及何时不在作业中使用(可变)副本 (Objective C)

When to and when not to use (mutable) copies in assignments (Objective C)

我是 Objective C 的新手,我不知道在 NS(Mutable)Dictionary 中我必须使用 (mutable)Copy 进行这样的分配:

dict[@"backup"] = dict[@"myList"];

使用调试我发现赋值必须这样完成:

dict[@"backup"] = [dict[@"myList"] mutableCopy];

现在的问题是:我怎么知道我必须使用副本(相对于引用)以及针对哪种类型的对象?

谢谢!

简单地说,这取决于分配元素的使用。如果您要更改其内容,它必须是可变的。如果您只是阅读它,请不要使其可变。

没有什么是您必须做的。

字典包含键值对。例如,为了让您的代码正常工作,dict 包含一些对象作为键 "myList" 的值。不知道那个物体是什么。您可以进行三个不同的分配,每个都完全有效,但做的事情不同:

dict [@"backup"] = dict [@"myList"];

在密钥 backup 下的密钥 myList 下存储已经存在的相同对象。如果对象是可变的,有人修改了对象,那么每个键下的对象都被修改了,因为是同一个对象。

dict [@"backup"] = [dict [@"myList"] copy];

"copy" 很有趣。通常它会创建一个对象的副本,所以你有两个对象,一个旧的和一个新的。如果原始文件是可变的,那么副本将是不可变的。但是如果原始对象是不可变的,那么 OS 假设复制没有意义,所以复制将给出原始对象。无论如何,dict [@"backup"] 将是一个不可变对象,不会受到对 dict [@"myList"] 的修改的影响,因为它不是同一个对象,或者因为 dict [@"myList"] 无法修改。

dict [@"backup"] = [dict [@"myList"] mutableCopy];

这会制作原始文件的可变副本并存储它。绝对不是同一个对象。而且是可以修改的。

这真的取决于你想要实现什么。这里没有对错之分。