@interface ViewController ()
@property (nonatomic,retain) NSString *rStr;
@property (nonatomic,copy) NSString *cStr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *mStr = [NSMutableString stringWithFormat:@"abc"];
self.rStr = mStr;
self.cStr = mStr;
NSLog(@"mStr is %@ %p",mStr,&mStr);
NSLog(@"_rStr is %@ %p",_rStr,&_rStr);
NSLog(@"_cStr is %@ %p",_cStr,&_cStr);
[mStr appendString:@"de"];
NSLog(@"mStr is %@",mStr);
NSLog(@"_rStr is %@",_rStr);
NSLog(@"_cStr is %@",_cStr);
}
@end
對源頭是NSMutableString的字符串,retain僅僅是指針引用,增加了引用計數器,這樣源頭改變的時候,用這種retain方式聲明的變量(無論被賦值的變量是可變的還是不可變的),它也會跟着改變;而copy聲明的變量,它不會跟着源頭改變,它實際上是深拷貝。
對源頭是NSString的字符串,無論是retain聲明的變量還是copy聲明的變量,當第二次源頭的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。
另外說明一下,這兩者對內存計數的影響都是一樣的,都會增加內存引用計數,都需要在最後的時候做處理。