方案:ui
方案一:copy不可变的字符串
spa
NSString*str = @"aaa"; NSString*copyStr = [str copy]; NSLog(@"str = %p copyStr= %p",str,copyStr); NSLog(@"指针地址:str = %p copyStr= %p",&str,©Str);
输出结果:str = 0x104d94068
copyStr= 0x104d94068
指针地址:str = 0x7fff529e9aa8
copyStr= 0x7fff529e9aa0
小结:对不可变的字符串的copy
,咱们对象的内存地址没有改变,只是指针的地址改变了,因此在这里咱们默认进行了一次浅拷贝
,只拷贝了指针。指针
方案二:copy可变的字符串
code
NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"]; NSString*copyStr1 = [str1 copy]; NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1); NSLog(@"str1 = %p copyStr1= %p",&str1,©Str1);
输出结果:str1 = 0x7fa522712cd0
copyStr1 = 0x7fa522717ba0
指针地址:str1 = 0x7fff529e9a98
copyStr1= 0x7fff529e9a90
小结:对可变字符串的copy,咱们默认进行了一次深拷贝,直接拷贝了对象。orm
mutableCopy不可变字符串的
NSString*str2 = @"ccc"; NSMutableString *copyStr2 = [str2 mutableCopy]; NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);
输出结果:str2 = 0x10d216108
copyStr2 = 0x7fa522726290
mutableCopy可变字符串
NSMutableString*str3 = [NSMutableString stringWithFormat:@"ddd"]; NSMutableString*copyStr3 = [str3 mutableCopy]; NSLog(@"str3 = %p copyStr3 = %p",str3,copyStr3);
输出结果:str3 = 0x7fa5227153c0
copyStr3 = 0x7fa5227263f0
由于copy默认返回的是不可变的,因此当咱们对一个不可变的字符串进行copy的时候,咱们只是拷贝了它的指针(浅拷贝)。当咱们对一个可变的字符串进行拷贝的时候,由于类型转变了,咱们需对其进行深拷贝
。不管对于可变的字符串仍是不可变的字符串进行mutableCopy,系统都默认进行深拷贝
,那么为何对于相同类型的进行mutableCopy返回的仍然是新的对象呢,由于在这里系统要保证,旧的对象和新的对象都是可变的,切他们以前不会相互影响。