NSSting大部分的時(shí)候copy, 那么用copy和strong/retain有什么區(qū)別呢?
@interface ViewController ()
@property (strong,nonatomic) NSString *strStrong;
@property (copy, nonatomic) NSString *strCopy;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 測(cè)試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);
控制臺(tái)輸出:
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新產(chǎn)生了一個(gè)string的副本, 當(dāng)改變tempString的時(shí)候不會(huì)影響到
strCopy, 而strStrong只是一個(gè)新增了一個(gè)指針指向tempString所指向的string.改變tempString, strStrong會(huì)跟著變化.
正常情況下我們都希望當(dāng)tempString改變的時(shí)候, self的string不會(huì)跟著變化, 所以我們一般用copy來(lái)設(shè)置string的屬性.但是如果希望字串的值跟著賦值的字串的值變化,可以使用strong或者retain.
注意:上面的情況是針對(duì)于當(dāng)把NSMutableString賦值給NSString的時(shí)候,才會(huì)有不同,如果是賦值是NSString對(duì)象,那么使用copy還是strong/retain,結(jié)果都是一樣的,因?yàn)镹SString對(duì)象本身就不能改變值.