可變屬性用strong,不可變屬性用copy
當源字符串是NSMutableString時,strong屬性只是增加了源字符串的引用計數,而copy屬性則是對源字符串做了次深拷貝,產生一個新的對象,且copy屬性對象指向這個新的對象。另外需要注意的是,這個copy屬性對象的類型始終是NSString,而不是NSMutableString,因此其是不可變的。
什么叫做淺拷貝,什么叫做深拷貝;
- 淺Copy:可以理解為指針的復制,只是多了一個指向這塊內存的指針,共用一塊內存。
- 深Copy:理解為內存的復制,兩塊內存是完全不同的,也就是兩個對象指針分別指向不同的內存,互不干涉。
@property (nonatomic, strong) NSString *stringStrong; //strong修飾的字符串對象
@property (nonatomic, copy) NSString *stringCopy; //copy修飾的字符串對象
NSString *strong = @"StrongStr!";
NSString *copy = @"CopyStr!";
self.stringStrong = strong;
self.stringCopy = copy;
NSLog(@"strong = %p",strong);
NSLog(@"stringStrong = %p",self.stringStrong);
NSLog(@"copy = %p",copy);
NSLog(@"stringCopy = %p",self.stringCopy);
tesssss[2308:776694] strong = 0x100345458
tesssss[2308:776694] stringStrong = 0x100345458
tesssss[2308:776694] copy = 0x100345478
tesssss[2308:776694] stringCopy = 0x100345478
用NSString給strong修飾的NSString 與
用copy修飾的NSString的結果一樣,最后都是拷貝了地址。
現在用兩個NSMutableString去給NSString賦值
@property (nonatomic, strong) NSString *stringStrong; //strong修飾的字符串對象
@property (nonatomic, copy) NSString *stringCopy; //copy修飾的字符串對象
NSMutableString *mutableStrong = [NSMutableString stringWithString:@"StrongMutableStr"];
NSMutableString *mutableCopy = [NSMutableString stringWithString:@"CopyMutableStr"];
self.stringStrong = mutableStrong;
self.stringCopy = mutableCopy;
NSLog(@"mutableStrong = %p",mutableStrong);
NSLog(@"stringStrong = %p",self.stringStrong);
NSLog(@"================");
NSLog(@"mutableCopy = %p",mutableCopy);
NSLog(@"stringCopy = %p",self.stringCopy);
tesssss[2312:777063] mutableStrong = 0x174070700
tesssss[2312:777063] stringStrong = 0x174070700
tesssss[2312:777063] ================
tesssss[2312:777063] mutableCopy = 0x174070740
tesssss[2312:777063] stringCopy = 0x174023340
用NSMutableString給strong修飾的NSString賦值,可見是復制了地址,引用計數加一。
用NSMutableString給copy修飾的NSString賦值,可見是復制了內容,兩塊地址不同
接下來修改NSMutableString的值
[mutableStrong appendString:@"Append Strong!"];
[mutableCopy appendString:@"Append Copy!"];
NSLog(@"mutableStrong = %@",mutableStrong);
NSLog(@"stringStrong = %@",self.stringStrong);
NSLog(@"================");
NSLog(@"mutableCopy = %@",mutableCopy);
NSLog(@"stringCopy = %@",self.stringCopy);
tesssss[2317:777820] mutableStrong = StrongMutableStrAppend Strong!
tesssss[2317:777820] stringStrong = StrongMutableStrAppend Strong!
tesssss[2317:777820] ================
tesssss[2317:777820] mutableCopy = CopyMutableStrAppend Copy!
tesssss[2317:777820] stringCopy = CopyMutableStr
strong修飾的NSString拷貝的是指針,指向的是同一片內存,所以當指針指向的地址的內容改變了之后,對應的值也被修改了。