我经常需要更改NSArray
或NSDictionary
的内容。通常我会这样:NSDictionary
- >创建NSMutableDictionary
并对其进行编辑 - >将原始NSDictionary
替换为已编辑的版本(不可变)。
我知道两种方法:
1)使用mutable copy
和copy
:
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];
这两种方式有什么区别吗?或者这两种方式中的一种有问题吗?
答案 0 :(得分:6)
首先,我建议不要使用属性点语法myDictionary.mutableCopy
而不是方法消息语法[myDictionary mutableCopy]
。这些意思完全相同,但我只保留实际属性的点符号(copy
和mutableCopy
是方法,而不是属性)。
要回答你的问题,这两种复制字典的方法的内部结构可能会有细微的差别,但我相信它们在功能上几乎相同。
我可能会建议使用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。 。 ..