返回
深入浅出,解析iOS中浅拷贝与深拷贝的奥妙
IOS
2023-10-20 13:40:42
浅拷贝:传递引用,修改原对象
浅拷贝是指仅复制对象本身的数据,而不复制其包含的对象。当对浅拷贝的对象进行修改时,原对象也会随之改变。浅拷贝操作只在内存中创建一个新对象,但指向的数据相同,因此对浅拷贝的对象所做的任何修改都会反应到原对象上。
优点:
- 速度快,内存占用少。
缺点:
- 修改新对象时,原对象也会受到影响。
浅拷贝示例代码:
// 创建一个可变数组
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开发中两个重要的概念。掌握它们之间的区别和应用场景,对提高代码质量和性能至关重要。浅拷贝速度快,内存占用少,但修改新对象时会影响到原对象。深拷贝速度慢,内存占用多,但修改新对象时不会影响到原对象。