前言
经过将近四周的学习,小组内对这四个星期的OC学习情况进行了考核,我发现自己对各种对象的深浅拷贝还存在一些问题,本篇博客是我对自己对深浅拷贝的理解和总结。
深浅拷贝的概念
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝。
浅拷贝不复制对象本身或对象内容,而仅仅复制对象引用的地址,因此,原始对象和副本将引用同一个内存地址,这意味着对任意一个对象所做的更改都会影响到另一个;
深拷贝会复制对象以及对象中包含的所有内容,副本将是原始对象的一个完整副本,包括所有的数据。在OC中,可以通过 copy 方法来实现深拷贝,但前提是对象是可变的。如果对象是不可变的,copy 通常只做浅拷贝。
ps:非容器类指如NSString,NSNumber等包装类;容器类是指如NSArray、NSSet、NSDictionary等的容器包装类。
非容器类
对非容器类,浅拷贝就是拷贝对象的地址,对象里面存的内容仍然只有一份,没有新的内存被分配,两个对象仍存在共用的部分,;深拷贝就是重新分配一块内存,把另一个对象的内容全部复制一份,存入新的对象里,两个对象没有任何共用的部分。
下面是对非容器类拷贝的代码演示:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 容器类
NSString* string11 = @"spyFamily";
NSString* string12 = [string11 copy];
NSString* string13 = [string11 mutableCopy];
NSMutableString* string14 = [string11 copy];
NSMutableString* string15 = [string11 mutableCopy];
NSLog(@"string11的地址为%p", string11);
NSLog(@"string12的地址为%p", string12);
NSLog(@"string13的地址为%p", string13);
NSLog(@"string14的地址为%p", string14);
NSLog(@"string15的地址为%p", string15);
NSMutableString* string21 = [NSMutableString stringWithString:@"间谍过家家"];
NSString* string22 = [string21 copy];
NSString* string23 = [string21 mutableCopy];
NSMutableString* string24 = [string21 copy];
NSMutableString* string25 = [string21 mutableCopy];
NSLog(@"string21的地址为%p", string21);
NSLog(@"string22的地址为%p", string22);
NSLog(@"string23的地址为%p", string23);
NSLog(@"string24的地址为%p", string24);
NSLog(@"string25的地址为%p", string25);
}
return 0;
}
运行结果:
容器类
对容器类,浅拷贝是对容器里的内容不进行拷贝,两个容器里的所装的东西是一样的,在一个容器中进行修改,则另一个容器中的内容也会变化;深拷贝是对容器中的每个元素都进行拷贝。
对于容器类的代码演示如下:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray* array = [NSArray arrayWithObjects:@"黄昏", @"约尔", @"阿尼亚", nil];
NSArray* copyArray1 = [array copy];
NSMutableArray* mutableCopyArray1 = [array mutableCopy];
NSLog(@"array的地址为%p", array);
NSLog(@"copyArray1地址为%p", copyArray1);
NSLog(@"mutableCopyArray1地址为%p", mutableCopyArray1);
NSLog(@"array[0]地址为%p", array[0]);
NSLog(@"copyArray1[0]地址为%p", copyArray1[0]);
NSLog(@"mutableCopyArray1[0]地址为%p", mutableCopyArray1[0]);
NSMutableArray* mutableArray = [NSMutableArray arrayWithObjects:@"黄昏",@"约尔",@"阿尼亚", nil];
NSArray* copyArray2 = [mutableArray copy];
NSMutableArray* mutableCopyArray2 = [mutableArray mutableCopy];
NSLog(@"mutableArray地址为%p", mutableArray);
NSLog(@"copyArray2地址为%p", copyArray2);
NSLog(@"mutableCopyArray2地址为%p", mutableCopyArray2);
总结
被拷贝的对象类型 | 拷贝方法 | 深/浅拷贝 |
---|---|---|
非容器类的不可变对象 | copy | 浅拷贝 |
非容器类的不可变对象 | mutableCopy | 深拷贝 |
非容器类的可变对象 | copy | 深拷贝 |
非容器类的可变对象 | mutableCopy | 深拷贝 |
容器类的不可变对象 | copy | 浅拷贝 |
容器类的不可变对象 | mutableCopy | 深拷贝 |
容器类的可变对象 | copy | 深拷贝 |
容器类的可变对象 | mutableCopy | 深拷贝 |