NSString什么时候用copy,什么时候用strong

来源:互联网 发布:淘宝怎么投诉卖家版权 编辑:程序博客网 时间:2024/04/26 17:03

大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢?

比如:

@property (retain,nonatomic) NSString *rStr;@property (copy, nonatomic)   NSString *cStr;- (void)test:{    NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];    self.rStr   = mStr;    self.cStr     = mStr;    NSLog(@"mStr:%p,%p",  mStr,&mStr);    NSLog(@"retainStr:%p,%p", _rStr, &_rStr);    NSLog(@"copyStr:%p,%p",   _cStr, &_cStr);}

假如,mStr对象的地址为0x11,也就是0x11是@“abc”的首地址,mStr变量自身在内存中的地址为0x123;
当把mStr赋值给retain的rStr时,rStr对象的地址为0x11,rStr变量自身在内存中的地址为0x124;rStr与mStr指向同样的地址,他们指向的是同一个对象@“abc”,这个对象的地址为0x11,所以他们的值是一样的。
当把mStr赋值给copy的cStr时,cStr对象的地址为0x22,cStr变量自身在内存中的地址0x125;cStr与mStr指向的地址是不一样的,他们指向的是不同的对象,所以copy是深复制,一个新的对象,这个对象的地址为0x22,值为@“abc”。

如果现在改变mStr的值:

    [mStr appendString:@"de"];    NSLog(@"retainStr:%@",  _rStr);    NSLog(@"copyStr:%@",    _cStr);

结果,
使用retain的字串rStr的值:@”abcde”,
而使用copy的字串cStr的值:@”abc”,
所以,如果一般情况下,我们都不希望字串的值跟着mStr变化,所以我们一般用copy来设置string的属性。
如果希望字串的值跟着赋值的字串的值变化,可以使用strong,retain。
注意:上面的情况是针对于当把NSMutableString赋值给NSString的时候,才会有不同,如果是赋值是NSString对象,那么使用copy还是strong,结果都是一样的,因为NSString对象根本就不能改变自身的值,他是不可变的。这里写代码片

0 0