NSSting 为什么用copy

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对象本身就不能改变值.

你可能感兴趣的:(NSSting 为什么用copy)