iOS提供了2个拷贝方法
1.copy
,不可变拷贝,产生不可变副本
2.mutableCopy
,可变拷贝,产生可变副本
深拷贝和浅拷贝
1.深拷贝
:内容拷贝,产生新的对象
2.浅拷贝
:指针拷贝,没有产生新的对象
NSString *str1 = [[NSString alloc] initWithFormat:@"test"];
NSString *str2 = [str1 copy]; // 返回的是NSString, 浅拷贝,指针拷贝,没有产生新对象
NSMutableString *str3 = [str1 mutableCopy];//返回的是NSMutableString,深拷贝,内容拷贝,有产生新对象
NSLog(@"%@ %@ %@", str1, str2, str3);
NSLog(@"%p %p %p", str1, str2, str3);
注释
:因为str1是不可变对象,[str1 copy] 返回str2也是不可变对象,两指针指向了同一块内存地址,所以是浅拷贝,[str1 mutableCopy]返回str3是可变对象,如果str3改变,不影响str1,就需要申请一块新的内存地址,所以str1、str3指针指向了不同的内存址,是深拷贝
NSMutableString *str1 = [[NSMutableString alloc] initWithFormat:@"test"];
NSString *str2 = [str1 copy]; // 深拷贝
NSMutableString *str3 = [str1 mutableCopy]; // 深拷贝
注释
:因为str1是可变对象,[str1 copy] 返回str2是不可变对象,如果str1改变,不影响str2,就需要申请一块新的内存地址,所以str1、str2指针指向了不同的内存址,是深拷贝,[str1 mutableCopy]返回str3是可变对象,如果str3改变,不影响str1,就需要申请一块新的内存地址,所以str1、str3指针指向了不同的内存址,是深拷贝
copy和mutableCopy