一,浅拷贝
只是指针的拷贝,并没有内存的改变。
二,深拷贝
会新生成一块内存,这块内存的初始值和原内存的初始值是相同的。但新内存存的值不可以改变
三,可变拷贝
也会新生成一个块新的内存,新内存的值和原内存的初始值是相同的,新内存存的值可改变。
代码如下:
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
/*浅拷贝
两个指针指向的是同一块内存,所以打印的地址相同
*/
NSString * strA = @"abc";
NSString * strB = [strA copy];
NSLog(@"strA:%p,strB:%p",strA,strB);
/*深拷贝
两个指针指向的是不同的内存,只不过初始值相同。新的内存值不可改变
*/
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello"];
NSString * str2 = [str1 copy];
/*可变拷贝
两个指针指向的是不同的内存,初始值相同。新的内存值可改变
*/
NSMutableString * str3 = [str1 mutableCopy];
NSLog(@"str1:%@,%p;str2:%@,%p;str3:%@,%p",str1,str1,str2,str2,str3,str3);
[str1 appendString:@"World"];
[str3 appendString:@"China"];
NSLog(@"str1:%@,%p;str2:%@,%p;str3:%@,%p",str1,str1,str2,str2,str3,str3);
}
return 0;
}
以下是控制台输出:
*注意点:
1,深拷贝和浅拷贝的区分是以是否开辟新的内存来进行区分的,也就是使用copy关键字,既可能是浅拷贝,也可能是深拷贝。关键是看指针初始指向的内存区块是否为可变内存区块。
2,一个对象是否能够进行拷贝,关键是看这个对象是否实现了NSCopy协议,也就是要实现- (id)copyWithZone:(nullable NSZone *)zone;
扩展:
copy方法除了可以对对象进行深拷贝以外还有个优点就是,相比于重新创建一个对象,copy的效率更高。例如要创建一百个MyTeam对象,实例化一个对象然后使用copy方法的效率要比实例化一百次高得多。