聊一聊NSString的strong copy mutableCopy。
简单概括一下深拷贝和浅拷贝。
浅拷贝:
指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝
深拷贝:
内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区
先定义两个NSString属性
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyedString;
一个用strong,一个用copy。
不可变字符串赋值
NSString *string = @"hui";
self.strongString = string;
self.copyedString = string;
NSLog(@"%p, %p, %p", string, self.strongString, self.copyedString);
打印地址的结果:
0x10e93b078, 0x10e93b078, 0x10e93b078
可见,不管是strong还是copy属性的对象,将不可变的字符串赋值给它们,它们都执行的是浅拷贝。
所以它们都指向了同一个地址。
可变字符串赋值
NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
self.strongString = mutableString;
self.copyedString = mutableString;
NSLog(@"%p, %p, %p", mutableString, self.strongString, self.copyedString);
打印地址的结果:
0x600003866700, 0x600003866700, 0x89853a7b95263aa8
从打印结果中可以发现,strong修饰的字符串(strongString)与mutableString指向了同一个地址,但是copy修饰的字符串(copyedString)指向了另外一个地址。因为执行了深拷贝。
不可变字符串调用mutableCopy
NSString *string = @"hui";
[[string mutableCopy] appendFormat:@"_li"];
// [[string copy] appendString:@"_li"]; 这句话执行会报错,因为copy后,拷贝出来的是一个不可变字符串
NSLog(@"%p, %p", string, [string mutableCopy]);
打印结果:
0x10ee70078, 0x6000037cec40
通过打印结果,可以得到,不可变字符串调用mutableCopy执行了深拷贝,拷贝出来的是一个可变的字符串。
可变字符串调用mutableCopy
NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
[[mutableString mutableCopy] appendFormat:@"_li"];
// [[mutableString copy] appendString:@"_li"]; //这句话执行会报错,因为copy后,拷贝出来的是一个不可变字符串
NSLog(@"%p, %p", mutableString, [mutableString mutableCopy]);
打印结果:
0x6000000916b0, 0x6000000c4b40
通过打印结果,可以得到,可变字符串调用mutableCopy执行了深拷贝,拷贝出来的是一个可变的字符串。
总结:
1. strong出来的字符串,执行的是浅拷贝;
2. copy出来的字符串一定是不可变的字符串。传入的字符串如果不可变,那么执行的就是浅拷贝;如果是可变,那么执行的就是深拷贝;
3. mutableCopy出来的字符串一定是可变的字符串,无论传入的字符串可变与否,都是执行深拷贝;
over!
网友评论