1):定义:
深拷贝:对原对象真正复制了一份,复制对象指向新的内存地址;(内容复制)
浅拷贝:并没有对原对象进行复制,复制对象与原对象指向同一内存地址;(指针复制)
2):本质:
原对象与拷贝对象的内存地址是否一致;
3):释例:
非容器不可变对象(NSString)
NSString *str = @"xxxxx";
NSString *copyStr = [str copy];
NSString *mutableCopyStr = [str mutableCopy];
i):对于非容器不可变对象,copy为浅拷贝。mutableCopy为深拷贝;
ii):对于非容器不可变对象,copy为不可变对象,mutableCopy为可变对象;
非容器可变对象(NSMutableString)
NSMutableString *str = [NSMutableString stringWithString:@"非容器可变对象"];
NSMutableString *copyStr = [str copy];
NSMutableString *mutableCopyStr = [str mutableCopy];
i):对于非容器可变对象,copy与mutableCopy为深拷贝;
ii):对于非容器可变对象,copy与mutableCopy为可变对象;
容器不可变对象(NSArray)
NSMutableString *str = [NSMutableString stringWithString:@"非容器可变对象"];
NSArray *array = [NSArray arrayWithObjects:str, @"非容器不可变对象", nil];
NSArray *copyArray = [array copy];
NSArray *mutableCopyArray = [array mutableCopy];
i):copy为浅拷贝,mutableCopy为深拷贝;
ii):copy为不可变对象,mutableCopy为可变对象;
iii):copy与mutableCopy容器内的对象与原对象类型(可变不可变),地址一致;
容器可变对象(NSMutableArray)
NSMutableString *str = [NSMutableString stringWithString:@"非容器可变对象"];
NSMutableArray *array = [NSMutableArray arrayWithObjects:str, @"非容器不可变对象", nil];
NSMutableArray *copyArray = [array copy];
NSMutableArray *mutableCopyArray = [array mutableCopy];
i):copy与mutableCopy均为深拷贝;
ii):copy出的对象不可变,mutableCopy出的对象可变;
iii):copy与mutableCopy新容器中的对象依然是浅拷贝
结论:
copy对于可变对象为深拷贝,对于不可变对象为浅拷贝;
mutableCopy始终为深拷贝
4):实现:
遵从NSCopying(NSMutableCopying)协议:
- (id)copyWithZone:(NSZone *)zone ;
- (id)mutableCopyWithZone:(NSZone *)zone;