objective-c - 可变副本与其他创建方式的区别

标签 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];

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

最佳答案

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

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

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

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

但我想归根结底还是要看个人喜好。

关于objective-c - 可变副本与其他创建方式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17808327/

相关文章:

ios - 我在 View 类中编写了一个tableView,但它无法显示数据源

ios - UIPickerView 选择更新 UITextFields 的 NSArray

ios - 解析Json获取一个NSArray中的所有内容

objective-c - JSONModel 返回 nil

objective-c - 如何使用 JSONModel 将 NSArray 序列化为 JSON

objective-c - Objective-c和Java之间的Field,我不明白@property和实例变量

iphone - SQLite 中的 BLOB?

ios - 延迟实例化

iphone - NSMutableArray 始终为空

iOS NSMutableArray removeObjectAtIndex