2018-04-19 NSString 用copy修饰为什么?
2018-04-19 本文已影响13人
龙之天下
当时问道这个问题彻底的蒙圈了,............, A lot of ellipsis on behalf of my mood (好多省略号代表我的心情)
接下来想做一些验证:
首先创建两个属性如下:
@property (nonatomic,copy) NSString * ntvCopyName;
@property (nonatomic, strong) NSString *strong_name;
提出自己的疑问?
//NSString 被copy修饰的ntvCopyName和被strong修饰的strong_name 地址会不会变化呢?
NSString * originString = @"To say To young people";
NSLog(@"originString:%@",originString);
NSLog(@"originString:%@--内存地址:%p",originString,originString);
self.ntvCopyName = originString;
self.strong_name = originString;
NSLog(@"self.copy_name :%@--内存地址:%p", self.ntvCopyName,self.ntvCopyName);
NSLog(@"self.strong_name:%@--内存地址:%p", self.strong_name,self.strong_name);
/*
用NSString类型验证的打印结果:
self.ntvCopyName和
self.strong_name的地址与originString地址一样
目前打印的值是一样
无论被copy修饰还是被strong的字符串的对象的 地址和值没有受影响
*/
// NSMutableString 被copy修饰的ntvCopyName和被strong修饰的strong_name 地址会不会变化呢?
NSMutableString *mutableString = [NSMutableString stringWithString:originString];
self.ntvCopyName = mutableString;
self.strong_name = mutableString;
NSLog(@"mutableString:%@--内存地址:%p",mutableString,mutableString);
NSLog(@"self.copy_name :%@--内存地址:%p", self.ntvCopyName,self.ntvCopyName);
NSLog(@"self.strong_name:%@--内存地址:%p", self.strong_name,self.strong_name);
/*
用NSMutableString类型验证的打印结果:
self.strong_name的地址还是与mutableString地址一样
self.ntvCopyName的地址发生变化了,并不与mutableString地址一样,它新开辟一块地址
目前打印的值是一样,指针指向并不是同一块地址
*/
// 给mutableString额外的添加字符串
[mutableString appendString:@"We should study deeply"];
NSLog(@"给mutableString额外的添加字符串:mutableString:%@--内存地址:%p",mutableString,mutableString);
NSLog(@"给mutableString额外的添加字符串:self.copy_name :%@--内存地址:%p", self.ntvCopyName,self.ntvCopyName );
NSLog(@"给mutableString额外的添加字符串:self.strong_name:%@--内存地址:%p", self.strong_name,self.strong_name);
/*
1.将NSMutableString 类型的对象赋值给被copy所修饰的NSString的对象,NSString的对象的地址会发生变化,并不和NSMutableString 类型的对象的地址一样
2.将NSMutableString 类型的对象赋值给被strong所修饰的NSString的对象,NSString的对象的地址会发生变化,和NSMutableString 类型的对象的地址一样
3.NSMutableString类型对象的值发生变化,则被copy所修饰的NSString的对象的值并不发生变化而被strong所修饰的NSString的对象的值随之变化(和NSMutableString类型对象的值一样)
*/
个人建议:
NSString 类型用copy所修饰,NSMutableString类型可以用strong来修饰。
以上个人观点,希望可以互相交流。