IOS開發之copy與MutableCopy

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.