iOS 中 深拷贝和浅拷贝的区别

时间:2024-01-26 22:04:11

在 iOS 开发中,深拷贝和浅拷贝是两种不同的对象复制方式,它们在处理 NSArrayNSMutableArray 以及其他集合类型时尤为重要。

浅拷贝(Shallow Copy)

  • 浅拷贝仅复制对象的指针,而不复制对象本身。
  • 如果你对一个对象进行浅拷贝,新对象和原对象将指向相同的内存地址。这意味着如果你修改了其中一个对象的内容,这种修改也会影响到另一个对象。

深拷贝(Deep Copy)

  • 深拷贝会复制对象本身,创建一个完全独立的副本。
  • 如果你对一个对象进行深拷贝,新对象和原对象将占用不同的内存地址。修改其中一个对象的内容不会影响到另一个对象。

NSArrayNSMutableArraycopymutableCopy

对于 NSArrayNSMutableArraycopymutableCopy 方法的行为如下:

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 的浅拷贝(实际上是同一个对象),而 deepCopyArraymutableCopyArray 是深拷贝的结果,它们是全新的对象。

注意事项

  • 在处理大型数据对象时,深拷贝可能会消耗更多的内存和处理时间。
  • 深拷贝和浅拷贝对于内存管理和防止不必要的数据修改非常重要,特别是在多线程环境中。
  • 了解 copymutableCopy 的行为对于防止数据被意外修改是关键。例如,如果你需要确保一个数组不会被改变,应该使用 copy 方法来获得一个不可变的副本。