可变副本和其他创建方法之间的区别

时间:2013-07-23 11:02:20

标签: objective-c nsmutablearray nsarray nsdictionary nsmutabledictionary

我经常需要更改NSArrayNSDictionary的内容。通常我会这样:NSDictionary - >创建NSMutableDictionary并对其进行编辑 - >将原始NSDictionary替换为已编辑的版本(不可变)。

我知道两种方法:

1)使用mutable copycopy

NSDictionary *myDictionary = @{...};
NSMutableDictionary *dicToEdit = myDictionary.mutableCopy;
// Editing goes here`
myDictionary = dicToEdit.copy;

2)使用arrayWithArray:dictionaryWithDictionary:

NSDictionary *myDictionary = @{...};
NSMutableDictionary *dicToEdit = [NSMutableDictionary dictionaryWithDictionary:myDictionary];
// Editing goes here
myDictionary = [NSDictionary dictionaryWithDictionary:dicToEdit];

这两种方式有什么区别吗?或者这两种方式中的一种有问题吗?

2 个答案:

答案 0 :(得分:6)

首先,我建议不要使用属性点语法myDictionary.mutableCopy而不是方法消息语法[myDictionary mutableCopy]。这些意思完全相同,但我只保留实际属性的点符号(copymutableCopy是方法,而不是属性)。

要回答你的问题,这两种复制字典的方法的内部结构可能会有细微的差别,但我相信它们在功能上几乎相同。

我可能会建议使用2),因为虽然稍微简洁一点,但我会说它会使代码意图更加清晰,并且在您需要两个指向相同字典的NSDictionary *变量时更加明显。

另外,我会说2)使代码语义更容易理解。使用1),您可以指示接收对象是否要获取可变不可变副本。使用2),您不关心您尝试复制的字典是可变还是不可变:结果字典的可变性仅取决于您使用的init方法。

但最终它只是归结为我个人的偏好。

答案 1 :(得分:0)

复制语句只提供不可变类型对象的不可变副本。

Mutable Copy返回不可变类型对象的可变副本。

这里已经大大解释了..... http://mobile.antonio081014.com/2012/09/speech-recognition-on-ios-with-openear.html

感谢Saroj Sharma。 。 ..