iOS copy和retain、strong的區別

把一個對象賦值給一個屬性變量,當這個對象變化了,如果希望屬性變量變化就使用strong屬性,如果希望屬性變量不跟着變化,就是用copy屬性。
例:

@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聲明的變量,當第二次源頭的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。

另外說明一下,這兩者對內存計數的影響都是一樣的,都會增加內存引用計數,都需要在最後的時候做處理。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章