定義:
1.copy:不可變復制?
2.mutableCopy:可變復制
實現協議:
1.copy:實現NSCopying協議
2.mutableCopy:實現NSMutableCopying協議
副本:
1.copy:
? ? ? ? a.如果是不可變的比如NSString,只復制了指針,并沒有創建新的實例,引用計數并沒有改變,相當于retain.
? ? ? ? b.如果是可變的 比如NSMutableString, 復制了新的內容,創建了一個新的immutable!!不可變實例。
2.mutableCopy:
? ? ? ? ? ?a.如果是不可變的比如NSString, 復制內容,創建新的可變的mutable實例
? ? ? ? ? ?b.如果是可變的比如NSMutableString,復制內容,穿件新的mutable!!可變的實例。
copy與strong的區別
兩個的區別主要在于setter方法的區別,說到底就是不同修飾符對應不同的setter方法。
@property (strong, nonamatic) NSMutableString *strongString;
@property (copy, nonatomic) NSMutableString *copyString;
- (void)setStrongString:(NSMutableString *)strongString {
? ? ? ?[_strongString release];
? ? ? ?_strongString = [strongString retain];
}
- (void)setCopyString:(NSMutableString *)copyString {
? ? ? ? [_copyString release];
? ? ? ? _copyString = [copyString copy];
}
再舉個例子:
@property (strong,nonatomic) NSArray*bookArray1;
@property (copy,nonatomic) NSArray*bookArray2;
NSMutableArray*books = [@[@"book1"] mutableCopy];? ??
Person *person = [[Person alloc] init];? ?
?person.bookArray1= books;? ?
?person.bookArray2= books;? ?
?[books addObject:@"book2"];
NSLog(@"bookArray1:%@",person.bookArray1);
NSLog(@"bookArray2:%@",person.bookArray2);}
可以看到bookArray1 與可變數組books指向同一塊內容區域,books內容改變,所以bookArray1內容也隨之改變。
而bookArray2,因為使用copy,在books被改變前其實復制了books的內容到一個新的內容區域里面,后面雖然改變了books但是,由于并不是一塊地址,所以并不改變內容。