相信有很多人都有這個疑惑,為什么NSString對象用copy修飾?其實NSString也是可以用strong修飾的但是最好還是選擇copy,為啥呢 ?請看下面的解釋
copy的意思是對值進行拷貝,分為淺拷貝與深拷貝,深拷貝會產(chǎn)生一個新對象;
strong是強引用,對象指針指向的是同一個,不會產(chǎn)生新對象;
我們先來看一個例子
@property (nonatomic, strong) NSMutableString *strStrong;
@property(nonatomic, copy) NSmutableString *strCopy;
NSMutableString *name = [[NSMutableString alloc] initWithString: @"hello"];
self.strStrong = name;
self.strCopy = name;
//1.此時給name拼接一個字符
[name appendString: @"word"];
NSLog(@"%@ %p", name, name);
NSLog(@"%@ %p", self.strStrong, self.strStrong);
NSLog(@"%@ %p", self.strCopy, self.strCopy);
結(jié)果為:
helloword 0x6000002495d0
helloword 0x6000002495d0
hello 0xa00006f6c6c65685
2.給self.strStrong拼接一個字符
[self.strStrong appendString: @"!?。?!"];
NSLog(@"%@ %p", name, name);
NSLog(@"%@ %p", strStrong, strStrong);
NSLog(@"%@ %p", strCopy, strCopy);
結(jié)果為:
helloword?。。?! 0x60400025d790
helloword?。。?! 0x60400025d790
hello 0xa00006f6c6c65685
可以看出,用strong修飾的屬性strStrong,隨著name值的變化,也跟著變化,然而copy修飾的值就沒有發(fā)生變化,更加安全。
使用copy,主要是為了防止當NSMutableString賦值給NSString時,兩者之一變化,都會引起另外一個值變化。
下面講一下深拷貝與淺拷貝
NSString *copy = @"apple";
NSString *copyString1 = [copy copy];//原對象
NSString *copyMuStr1 = [copy mutableCopy];//產(chǎn)生新的對象
NSLog(@"%p %p %p", copy, copyString1, copyMuStr1);
//0x1034c2118 0x1034c2118 0x60400025f5c0
NSMutableString *mutabStr = [NSMutableString stringWithString:@"watermelon"];
NSString *copyStr2 = [mutabStr copy];//產(chǎn)生新的對象
NSString *copyMuStr2 = [mutabStr mutableCopy];//產(chǎn)生新的對象
NSLog(@"%p %p %p", mutabStr, copyStr2, copyMuStr2);
//0x600000247800 0x60000003fd40 0x600000247530

AAC3A81E1115A66FBDAA1966DD89CE89.png