Objective-c 深淺複製,objective-c深淺
深淺複製的定義:
淺複製:在複製時,對於被複製對象的每一層都是指標複製。
深複製:在複製時,對於被複製的對象至少有一層是對象複製。
完全複製:在複製時,對於被複製對象的每一層都是完全複製。
retain: 始終是潛複製,引用計數器每次加一,返回對像是否可變與被複製對象保持一致。
copy: 對於可變對象是深複製,引用計數不改變。對於不可變對象是淺複製,引用對象每次加一,始終返回一個不可變對象。
MutableCopy: 始終是深複製,引用計數不改變,始終返回一個可變對象。
不可變對象:值發生改變,其記憶體首地址隨之改變。
可變對象: 無論值發生改變,其記憶體首地址都不會發生改變。
引用計數:為了讓使用者知道,該對象有多少個擁有者。
下面通過一個程式來具體展現它的用法:
1 #import <Foundation/Foundation.h> 2 3 int main(int argc , const char *argv[]){ 4 @autoreleasepool { 5 NSLog(@"-------------不可變對象到不可變對象的轉換-------------"); 6 NSString *str1 = @"aaaa"; 7 NSString *str2 = [str1 copy]; // 對於不可變對象來說,是潛複製,計數器加一,始終返回一個不可變對象 8 NSLog(@"str1 = %p , str2 = %p",str1,str2); // str1 和 str2 地址相同,沒有產生新的字串 9 10 NSLog(@"-------------可變對象到可變對象的轉換---------------");11 NSMutableString *str3 = [NSMutableString stringWithString:@"aaaa"];12 NSMutableString *str4 = [str3 mutableCopy]; // copy對於可變字串來說是深複製13 NSLog(@"str3 = %p , str4 = %p",str3,str4); // str3 和 str4 地址不同,產生新的字串14 15 NSLog(@"-------------可變對象到不可變對象的轉換---------------");16 str1 = [str3 copy]; // copy 對於可變字元來說是深複製17 NSLog(@"str1 = %p , str3 = %p",str1,str3);18 19 NSLog(@"-------------不可變對象到可變對象的轉換---------------");20 str3 = [str1 mutableCopy]; // copy 對於不可變字串來說是淺複製21 NSLog(@"str1 = %p , str3 = %p",str1,str3);22 23 }24 return 0;25 }
運行結果:
2016-03-12 17:16:21.062 test[2349:183297] -------------不可變對象到不可變對象的轉換-------------
2016-03-12 17:16:21.063 test[2349:183297] str1 = 0x100001070 , str2 = 0x100001070
2016-03-12 17:16:21.064 test[2349:183297] -------------可變對象到可變對象的轉換---------------
2016-03-12 17:16:21.064 test[2349:183297] str3 = 0x100200210 , str4 = 0x1002003d0
2016-03-12 17:16:21.064 test[2349:183297] -------------可變對象到不可變對象的轉換---------------
2016-03-12 17:16:21.064 test[2349:183297] str1 = 0x6161616145 , str3 = 0x100200210
2016-03-12 17:16:21.064 test[2349:183297] -------------不可變對象到可變對象的轉換---------------
2016-03-12 17:16:21.065 test[2349:183297] str1 = 0x6161616145 , str3 = 0x1002002d0
什麼時候用到深淺拷貝?
深拷貝是在要將一個對象從可變(不可變)轉化為不可變(可變)或者將一份內容複製一份時用到的。淺拷貝是在要複製一個對象的指標時用到的。