在 iOS 开发中,深拷贝和浅拷贝是两种不同的对象复制方式,它们在处理 NSArray、NSMutableArray 以及其他集合类型时尤为重要。
浅拷贝(Shallow Copy)
- 浅拷贝仅复制对象的指针,而不复制对象本身。
- 如果你对一个对象进行浅拷贝,新对象和原对象将指向相同的内存地址。这意味着如果你修改了其中一个对象的内容,这种修改也会影响到另一个对象。
深拷贝(Deep Copy)
- 深拷贝会复制对象本身,创建一个完全独立的副本。
- 如果你对一个对象进行深拷贝,新对象和原对象将占用不同的内存地址。修改其中一个对象的内容不会影响到另一个对象。
NSArray 和 NSMutableArray 的 copy 与 mutableCopy
对于 NSArray 和 NSMutableArray,copy 和 mutableCopy 方法的行为如下:
NSArray
- 使用
copy方法对NSArray进行浅拷贝,结果是一个不可变数组(NSArray)。 - 使用
mutableCopy方法则会进行深拷贝,结果是一个可变数组(NSMutableArray)。
NSMutableArray
- 使用
copy方法对NSMutableArray进行深拷贝,结果是一个不可变数组(NSArray)。 - 使用
mutableCopy方法也会进行深拷贝,结果是一个新的可变数组(NSMutableArray)。
示例
NSArray *originalArray = @[ @"Apple", @"Banana", @"Cherry" ];
// 浅拷贝,originalArray 和 shallowCopyArray 指向同一个数组对象
NSArray *shallowCopyArray = originalArray;
// 深拷贝,deepCopyArray 是一个全新的数组对象
NSArray *deepCopyArray = [originalArray copy];
// 深拷贝,mutableCopyArray 是一个全新的 NSMutableArray 对象
NSMutableArray *mutableCopyArray = [originalArray mutableCopy];
// 对 NSMutableArray 的 copy 也是深拷贝,但结果是不可变的
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:originalArray];
NSArray *copiedArray = [mutableArray copy];在这个示例中,shallowCopyArray 是对 originalArray 的浅拷贝(实际上是同一个对象),而 deepCopyArray 和 mutableCopyArray 是深拷贝的结果,它们是全新的对象。
注意事项
- 在处理大型数据对象时,深拷贝可能会消耗更多的内存和处理时间。
- 深拷贝和浅拷贝对于内存管理和防止不必要的数据修改非常重要,特别是在多线程环境中。
- 了解
copy和mutableCopy的行为对于防止数据被意外修改是关键。例如,如果你需要确保一个数组不会被改变,应该使用copy方法来获得一个不可变的副本。










