理解 retain 、copy 、NSMutableString 、NSString 的用法

jopen 8年前發布 | 6K 次閱讀 iOS開發 移動開發

copy為內容拷貝,retain為指針拷貝,NSMutableString為可變字符串,NSString為不可變字符串。

但并不表示這個對象聲明的變量的值不可變,而是表示它初始化以后,你不能改變該變量所分配的內存中的值,但你可以重新分配該變量所處的內存空間。而NSMutableString是可變的,意味著你可以追加它的內存空間,或者修改它所分配的內存空間中的值。

"NSString *"這個數據類型代表一個NSString對象的指針,不是NSString對象本身。

"NSMutableString *"這個數據類型則是代表"NSMutableString"對象本身,這兩者是有區別的。

這也是有的時候我們使用NSMutableString類型字符串時,要使用copy的原因,因為可能不想改變新的字符串時影響到舊的字符串的值。

不管是retain還是copy對于NSString來說都是淺拷貝,還是指向的之前的內存區域。

@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.html



來自: http://my.oschina.net/jack088/blog/595251

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!