2

我经常需要更改 anNSArrayNSDictionary. 通常我会这样: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];

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

4

2 回答 2

6

首先,我建议不要使用属性点语法myDictionary.mutableCopy而不是方法消息语法[myDictionary mutableCopy]。这些含义完全相同,但我只会将点表示法保存为真实属性(copy并且mutableCopy是方法,而不是属性)。

为了回答您的问题,这两种复制字典的方式的内部工作方式可能存在细微差别,但我相信它们在功能上几乎是等效的。

我可能会推荐使用2),因为虽然稍微不那么简洁,但我会说它使代码意图更清晰,更容易区分当你需要两个不同NSDictionary *的变量指向同一个字典时。

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

但最终它只是归结为个人喜好,我猜。

于 2013-07-23T11:22:21.897 回答
0

Copy 语句只是给出不可变类型对象的不可变副本。

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

这些已经在这里得到了很好的解释...... http://mobile.antonio081014.com/2012/09/speech-recognition-on-ios-with-openear.html

感谢萨罗吉夏尔马。. ..

于 2014-03-17T06:26:07.530 回答