copy爲內容拷貝,retain爲指針拷貝,NSMutableString爲可變字符串,NSString爲不可變字符串。html
但並不表示這個對象聲明的變量的值不可變,而是表示它初始化之後,你不能改變該變量所分配的內存中的值,但你能夠從新分配該變量所處的內存空間。而NSMutableString是可變的,意味着你能夠追加它的內存空間,或者修改它所分配的內存空間中的值。atom
"NSString *"這個數據類型表明一個NSString對象的指針,不是NSString對象自己。指針
"NSMutableString *"這個數據類型則是表明"NSMutableString"對象自己,這二者是有區別的。code
這也是有的時候咱們使用NSMutableString類型字符串時,要使用copy的緣由,由於可能不想改變新的字符串時影響到舊的字符串的值。orm
無論是retain仍是copy對於NSString來講都是淺拷貝,仍是指向的以前的內存區域。htm
@property (retain, nonatomic) NSString *retainStr; @property (copy, nonatomic) NSString *copyStr; @property (retain, nonatomic) NSMutableString *retainMStr; @property (copy, nonatomic) NSMutableString *copyMStr;
NSMutableString *mStr = [NSMutableString string]; [mStr setString:@"我沒變"]; self.retainStr = mStr; self.copyStr = mStr; self.retainMStr = mStr; self.copyMStr = mStr; NSLog(@"retainStr:%@", self.retainStr); NSLog(@"copyStr:%@", self.copyStr); NSLog(@"retainMStr:%@", self.retainMStr); NSLog(@"copyMStr:%@", self.copyMStr); NSLog(@"\n"); [mStr setString:@"我變了"]; NSLog(@"retainStr:%@", self.retainStr); NSLog(@"copyStr:%@", self.copyStr); NSLog(@"retainMStr:%@", self.retainMStr); NSLog(@"copyMStr:%@", self.copyMStr); NSLog(@"\n"); NSString *str = @"我來了";//[[NSString alloc] initWithFormat:@"我來了"];//兩種方式都同樣。 self.retainStr = str; self.copyStr = str; self.retainMStr = [str mutableCopy]; self.copyMStr = [str mutableCopy]; NSLog(@"retainStr:%@", self.retainStr); NSLog(@"copyStr:%@", self.copyStr); NSLog(@"retainMStr:%@", self.retainMStr); NSLog(@"copyMStr:%@", self.copyMStr); NSLog(@"\n"); str =@"我走了";//[[NSStringalloc] initWithFormat:@"我走了"];//兩種方式都同樣 NSLog(@"retainStr:%@", self.retainStr); NSLog(@"copyStr:%@", self.copyStr); NSLog(@"retainMStr:%@", self.retainMStr); NSLog(@"copyMStr:%@", self.copyMStr); NSLog(@"\n");
//打印結果 2015-12-31 14:05:42.780 SXH[24228:1216731] retainStr:我沒變 2015-12-31 14:05:43.312 SXH[24228:1216731] copyStr:我沒變 2015-12-31 14:05:43.857 SXH[24228:1216731] retainMStr:我沒變 2015-12-31 14:05:44.548 SXH[24228:1216731] copyMStr:我沒變 2015-12-31 14:05:57.064 SXH[24228:1216731] 2015-12-31 14:06:17.624 SXH[24228:1216731] retainStr:我變了 2015-12-31 14:06:19.612 SXH[24228:1216731] copyStr:我沒變 2015-12-31 14:06:24.666 SXH[24228:1216731] retainMStr:我變了 2015-12-31 14:06:27.213 SXH[24228:1216731] copyMStr:我沒變 2015-12-31 14:06:29.316 SXH[24228:1216731] 2015-12-31 14:06:52.438 SXH[24228:1216731] retainStr:我來了 2015-12-31 14:06:52.962 SXH[24228:1216731] copyStr:我來了 2015-12-31 14:06:53.484 SXH[24228:1216731] retainMStr:我來了 2015-12-31 14:06:53.951 SXH[24228:1216731] copyMStr:我來了 2015-12-31 14:06:58.966 SXH[24228:1216731] 2015-12-31 14:07:53.086 SXH[24228:1216731] retainStr:我來了 2015-12-31 14:07:53.865 SXH[24228:1216731] copyStr:我來了 2015-12-31 14:07:54.383 SXH[24228:1216731] retainMStr:我來了 2015-12-31 14:07:54.964 SXH[24228:1216731] copyMStr:我來了
ps:對象
http://www.cnblogs.com/celestial/archive/2012/10/12/2721244.htmlblog