我经常需要更改 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];
这两种方式有什么区别吗?还是这两种方式中的一种有问题?
最佳答案
首先,我建议不要使用属性点语法 myDictionary.mutableCopy
而不是方法消息传递语法 [myDictionary mutableCopy]
。这些意思完全相同,但我只会为实际属性保存点符号(copy
和 mutableCopy
是方法,而不是属性)。
为了回答您的问题,这两种复制字典的内部机制可能存在细微差别,但我相信它们在功能上几乎是等价的。
我可能会推荐使用 2)
,因为虽然稍微不那么简洁,但我会说它使代码意图更清晰,并且在您需要两个不同的 NSDictionary *
时更容易区分指向同一个字典的变量。
另外,我想说 2)
使代码语义更容易理解。使用 1)
,您指示接收对象是要获取可变 还是不可变 副本。使用 2)
,您不关心您尝试复制的字典是可变的还是不可变的:生成的字典的可变性仅取决于您使用的 init 方法。
但我想归根结底还是要看个人喜好。
关于objective-c - 可变副本与其他创建方式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17808327/