因为NSString是不可变的数据类型,它有对应的可变数据类型NSMutableString。用string修饰会有NSString被修改的可能,所以有对应可变数据类型的不可变数据类型都应该修饰为copy,copy表示该属性不能被修改。
PS:如果对可变数据类型如NSMutableString用copy来修饰,那么当对其进行修改时,程序会崩溃。
NSMutableArray和NSMutableString不能用copy修饰
验证:
首先定义两个属性:
@property (copy,nonatomic) NSString *copString;
@property (strong,nonatomic) NSString *strongString;
进行验证
NSMutableString *aString = [[NSMutableString alloc]initWithString:@"aaa"];
NSMutableString *bString = [[NSMutableString alloc]initWithString:@"bbb"];
self.copString = aString;
self.strongString = bString;
NSLog(@"aString的地址:%p,bString的地址:%p",aString,bString);
NSLog(@"copyString的值:%@,strongString的值:%@",self.copString,self.strongString);
NSLog(@"copyString的地址:%p,strongString的地址:%p",self.copString,self.strongString);
[aString appendString:@"aaa"];
[bString appendString:@"bbb"];
NSLog(@"aString的地址:%p,bString的地址:%p",aString,bString);
NSLog(@"copyString的值:%@,strongString的值:%@",self.copString,self.strongString);
NSLog(@"copyString的地址:%p,strongString的地址:%p",self.copString,self.strongString);
控制台输出
2019-01-18 16:38:00.241352+0800 bing[15277:1294306] aString的地址:0x6000031ee850,bString的地址:0x6000031ee070
2019-01-18 16:38:00.241455+0800 bing[15277:1294306] copyString的值:aaa,strongString的值:bbb
2019-01-18 16:38:00.241532+0800 bing[15277:1294306] copyString的地址:0x88df3104acfd2c12,strongString的地址:0x6000031ee070
2019-01-18 16:38:00.241606+0800 bing[15277:1294306] aString的地址:0x6000031ee850,bString的地址:0x6000031ee070
2019-01-18 16:38:00.241680+0800 bing[15277:1294306] copyString的值:aaa,strongString的值:bbbbbb
2019-01-18 16:38:00.241759+0800 bing[15277:1294306] copyString的地址:0x88df3104acfd2c12,strongString的地址:0x6000031ee070
结论:
copy修饰的字符串的值,在NSMutableString的值改变后没变,而strong修饰的字符串的值发生了改变,两者的内存地址都没有发生变化。
并没有发现经常听说的有关深复制,浅复制的问题,不知为何,如有问题,希望指出,谢谢。