返回

深入浅出,解析iOS中浅拷贝与深拷贝的奥妙

IOS

浅拷贝:传递引用,修改原对象

浅拷贝是指仅复制对象本身的数据,而不复制其包含的对象。当对浅拷贝的对象进行修改时,原对象也会随之改变。浅拷贝操作只在内存中创建一个新对象,但指向的数据相同,因此对浅拷贝的对象所做的任何修改都会反应到原对象上。

优点:

  • 速度快,内存占用少。

缺点:

  • 修改新对象时,原对象也会受到影响。

浅拷贝示例代码:

// 创建一个可变数组
NSMutableArray *originalArray = [[NSMutableArray alloc] initWithObjects:@"a", @"b", @"c", nil];

// 浅拷贝数组
NSMutableArray *shallowCopyArray = [originalArray copy];

// 修改浅拷贝数组中的值
[shallowCopyArray addObject:@"d"];

// 打印原数组和浅拷贝数组
NSLog(@"Original array: %@", originalArray);
NSLog(@"Shallow copy array: %@", shallowCopyArray);

输出结果:

Original array: (a, b, c, d)
Shallow copy array: (a, b, c, d)

可以发现,当我们修改浅拷贝数组时,原数组中的值也发生了改变。

深拷贝:传递值,新建对象

深拷贝是指创建一个新的对象,并复制原对象的所有数据和子对象。当对深拷贝的对象进行修改时,原对象不会受到影响。深拷贝操作在内存中创建了一个新的对象,并将原对象的数据逐个复制到新对象中。这样,对深拷贝的对象所做的任何修改都不会反应到原对象上。

优点:

  • 修改新对象时,不会影响到原对象。

缺点:

  • 速度慢,内存占用多。

深拷贝示例代码:

// 创建一个可变数组
NSMutableArray *originalArray = [[NSMutableArray alloc] initWithObjects:@"a", @"b", @"c", nil];

// 深拷贝数组
NSMutableArray *deepCopyArray = [[NSMutableArray alloc] initWithArray:originalArray copyItems:YES];

// 修改深拷贝数组中的值
[deepCopyArray addObject:@"d"];

// 打印原数组和深拷贝数组
NSLog(@"Original array: %@", originalArray);
NSLog(@"Deep copy array: %@", deepCopyArray);

输出结果:

Original array: (a, b, c)
Deep copy array: (a, b, c, d)

可以发现,当我们修改深拷贝数组时,原数组中的值没有发生改变。

浅拷贝与深拷贝的应用场景

浅拷贝和深拷贝在不同的场景下有不同的应用。一般来说,当需要对对象进行修改时,应该使用深拷贝,以避免对原对象造成影响。例如,在将数据从一个视图控制器传递到另一个视图控制器时,应该使用深拷贝,以确保两个视图控制器对数据的修改互不影响。

而浅拷贝则适用于不需要修改对象的情况。例如,在将数据从一个数组传递到另一个数组时,可以使用浅拷贝,因为两个数组中的数据不需要相互影响。

总结

浅拷贝和深拷贝是iOS开发中两个重要的概念。掌握它们之间的区别和应用场景,对提高代码质量和性能至关重要。浅拷贝速度快,内存占用少,但修改新对象时会影响到原对象。深拷贝速度慢,内存占用多,但修改新对象时不会影响到原对象。