標籤:style blog color io os ar for div sp
在開發工程中,很多時候我們要建立對象的副本,要棄置站台,對象所在的類必須遵守 NSCopying 和 NSMutableCopying 的協議:
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
一般Foundation的類都遵守這兩個協議,都可以直接複製。
複製分多種情況
一:非容器類的不可變對象的複製,copy不產生副本,只有MutableCopy才產生副本。
1.不可變對象的copy
copy是一種淺拷貝,只複製對象指標的值,不產生副本,只增加對象的引用計數。
NSString * ns1 = [[NSString alloc] initWithFormat:@"%@",@"1234"]; NSString * copyns1 = [ns1 copy]; NSLog(@"copy: %lu %lu",ns1.retainCount,copyns1.retainCount);
2.不可變對象的MutableCopy
mutableCopy產生可變對象,也就是一個副本,是一種深拷貝,但不改變原對象的引用計數。
NSString * ns1 = [[NSString alloc] initWithFormat:@"%@",@"1234"];
NSMutableString * mcns1 = [ns1 mutableCopy];
NSLog(@"%lu %lu %lu",ns1.retainCount,copyns1.retainCount,mcns1.retainCount);
二:非容器類的可變對象的複製,不管是copy還是MutableCopy都會產生新的副本。
1.可變對象的copy
copy產生一個新的不可變對象。(產生副本)
NSMutableString * ms1 = [[NSMutableString alloc] initWithFormat:@"%@",@"4567" ]; NSString* copyms1 = [ms1 copy]; NSLog(@"muablecopy: %lu %lu",ms1.retainCount,copyms1.retainCount);
2.可變對象的MutableCopy
MutableCopy產生一個新的可變對象。(產生副本)
NSMutableString * ms1 = [[NSMutableString alloc] initWithFormat:@"%@",@"4567" ];
NSMutableString * mcms1 = [ms1 mutableCopy];
NSLog(@"%lu %lu %lu",ms1.retainCount,copyms1.retainCount,mcms1.retainCount);
三 不可變容器類的copy和MutableCopy (容器類的複製預設是淺複製,即只複製容器類對象本身,不複製容器裡的對象)
1.copy不產生新的副本,只增加數組本身的引用計數,數組內的對象的引用計數沒有增加。
NSArray *arr1=[NSArray arrayWithObjects:@1,@2,@3,@4,nil]; NSArray *copyArray=[arr1 copy]; NSLog(@"%p %p",arr1,copyArray);
NSLog(@"%lu %lu",(unsigned long)arr1.retainCount,(unsigned long)copyArray.retainCount);
2.MutableCopy產生一個副本,是一個可變數組,原數組本身的引用計數沒有增加,但數組內的對象的引用計數增加。
NSArray *arr1=[NSArray arrayWithObjects:@1,@2,@3,@4,nil];NSMutableArray *copyArray=[arr1 mutableCopy];NSLog(@"%p %p",arr1,copyArray);NSLog(@"%lu %lu",(unsigned long)arr1.retainCount,(unsigned long)copyArray.retainCount)
四 可變容器類的copy和MutableCopy
1.copy產生一個副本,是不可變的數組,數組內的對象的引用計數增加。
2.MutableCopy也產生一個副本,是可變的數組,數組內的引用計數增加。
關於Copy和MutableCopy的總結:
對於不可變的對象,Copy不產生新對象,其作用就相當於retain,增加引用計數。MutableCopy產生新的可變對象,原對象的引用計數不變。
對於可變對象來說,Copy和MutableCopy都產生副本,也就是新對象,但Copy是不可變的副本,MutableCopy是可變的副本。
關於Copy和MutableCopy結果的總結:
Copy的結果是不可變的,而MutableCopy的結果是可變的。
IOS開發之copy與MutableCopy