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

Fra*_*kZp 2 objective-c nsdictionary nsmutablearray nsarray nsmutabledictionary

我经常需要更改一个NSArray或一个的内容NSDictionary.通常我会这样:NSDictionary- >创建NSMutableDictionary并编辑它 - >用编辑过的原件替换原件NSDictionary(作为不可变的).

我知道有两种方法可以做到这一点:

1)使用mutable copycopy:

NSDictionary *myDictionary = @{...};
NSMutableDictionary *dicToEdit = myDictionary.mutableCopy;
// Editing goes here`
myDictionary = dicToEdit.copy;
Run Code Online (Sandbox Code Playgroud)

2)使用arrayWithArray:dictionaryWithDictionary:

NSDictionary *myDictionary = @{...};
NSMutableDictionary *dicToEdit = [NSMutableDictionary dictionaryWithDictionary:myDictionary];
// Editing goes here
myDictionary = [NSDictionary dictionaryWithDictionary:dicToEdit];
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*aez 6

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

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

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

另外,我会说这2)使得代码语义更容易理解.随1)您指示接收对象是否要获取可变不可变副本.有了2)你不关心你正试图复制字典是否是可变的或不可变的:所产生的字典的易变性只是取决于你所使用的init方法.

但最终它只是归结为个人偏好我想.