Objective-c 深淺複製,objective-c深淺

來源:互聯網
上載者:User

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

 

 

什麼時候用到深淺拷貝?

  深拷貝是在要將一個對象從可變(不可變)轉化為不可變(可變)或者將一份內容複製一份時用到的。淺拷貝是在要複製一個對象的指標時用到的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.