何时何时不在作业中使用(可变)副本(目标C)

时间:2015-04-25 12:45:34

标签: objective-c nsmutabledictionary

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

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

使用调试我发现分配必须这样完成:

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

必须做什么。

字典包含键值对。例如,要使代码生效,dict包含一些对象作为键“myList”的值。不知道那个对象是什么。你可以做三个不同的任务,每个任务都完全有效,但做了不同的事情:

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

也存储密钥备份下的密钥myList下已存在的同一对象。如果对象是可变的,并且有人修改了对象,则修改每个键下的对象,因为它是同一个对象。

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

“复制”很有意思。通常它会创建对象的副本,因此您有两个对象,旧对象和新对象。如果原始文件是可变的,那么副本将是不可变的。但是如果原始版本是不可变的,那么操作系统会认为复制没有意义,因此复制将给出原始对象。无论如何,dict [@“backup”]将是一个不可变对象,不能受到对dict [@“myList”]的修改的影响,因为它不是同一个对象,或者因为dict [@“myList”]无法修改。

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

这使得原件的可变副本存储起来。它绝对不是同一个对象。它可以修改。

这实际上取决于你想要达到的目标。这里没有对错。

答案 1 :(得分:1)

简单地说,它取决于指定元素的使用。如果要更改其内容,则必须是可变的。如果你只是阅读它,不要让它变得可变。