NSSting大部分的时候copy, 那么用copy和strong/retain有什么区别呢?
@interface ViewController ()
@property (strong,nonatomic) NSString *strStrong;
@property (copy, nonatomic) NSString *strCopy;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 测试string
NSMutableString *tempString = [NSMutableString stringWithFormat:@"hello"];
self.strCopy = tempString;
self.strStrong = tempString;
NSLog(@"tempString: 字符串地址:%p, 指针地址:%p, 值:%@", tempString, &tempString, tempString);
NSLog(@"strStrong: 字符串地址:%p, 指针地址:%p, 值:%@", _strStrong, &_strStrong, _strStrong);
NSLog(@"strCopy: 字符串地址:%p, 指针地址:%p, 值:%@", _strCopy, &_strCopy, _strCopy);
// 改变tempString
[tempString appendString:@" world"];
NSLog(@"改变后: \n\n");
NSLog(@"tempString: 字符串地址:%p, 指针地址:%p, 值:%@", tempString, &tempString, tempString);
NSLog(@"strStrong: 字符串地址:%p, 指针地址:%p, 值:%@", _strStrong, &_strStrong, _strStrong);
NSLog(@"strCopy: 字符串地址:%p, 指针地址:%p, 值:%@", _strCopy, &_strCopy, _strCopy);
控制台输出:
2016-10-24 13:00:09.328308 NSString[2069:826291] tempString: 字符串地址:0x170269080, 指针地址:0x16fda1f48, 值:hello
2016-10-24 13:00:09.328447 NSString[2069:826291] strStrong: 字符串地址:0x170269080, 指针地址:0x10020a3c8, 值:hello
2016-10-24 13:00:09.328601 NSString[2069:826291] strCopy: 字符串地址:0xa00006f6c6c65685, 指针地址:0x10020a3d0, 值:hello
2016-10-24 13:00:09.328669 NSString[2069:826291] 改变后:
2016-10-24 13:00:09.328810 NSString[2069:826291] tempString: 字符串地址:0x170269080, 指针地址:0x16fda1f48, 值:hello world
2016-10-24 13:00:09.328959 NSString[2069:826291] strStrong: 字符串地址:0x170269080, 指针地址:0x10020a3c8, 值:hello world
2016-10-24 13:00:09.329028 NSString[2069:826291] strCopy: 字符串地址:0xa00006f6c6c65685, 指针地址:0x10020a3d0, 值:hello
可以看到strCopy新产生了一个string的副本, 当改变tempString的时候不会影响到
strCopy, 而strStrong只是一个新增了一个指针指向tempString所指向的string.改变tempString, strStrong会跟着变化.
正常情况下我们都希望当tempString改变的时候, self的string不会跟着变化, 所以我们一般用copy来设置string的属性.但是如果希望字串的值跟着赋值的字串的值变化,可以使用strong或者retain.
注意:上面的情况是针对于当把NSMutableString赋值给NSString的时候,才会有不同,如果是赋值是NSString对象,那么使用copy还是strong/retain,结果都是一样的,因为NSString对象本身就不能改变值.