copy與mutableCopy

1、深拷貝和淺拷貝

  • 深拷貝:對象拷貝 - 直接拷貝內容。spa

  • 淺拷貝:指針拷貝 - 將指針中的地址值拷貝一份。指針

2、對於 Copy 與 mutableCopy 的實踐

  • 思路:我用四個方案來驗證 Copy 與 mutableCopy 的區別。code

  • 方案:orm

    • 方案一:copy不可變的字符串對象

NSString*str = @"aaa";
NSString*copyStr = [str copy];
NSLog(@"str = %p copyStr= %p",str,copyStr);
NSLog(@"指針地址:str = %p copyStr= %p",&str,&copyStr);

    輸出結果:str = 0x104d94068 copyStr= 0x104d94068
    指針地址:str = 0x7fff529e9aa8 copyStr= 0x7fff529e9aa0
    小結:對不可變的字符串的copy,咱們對象的內存地址沒有改變,只是指針的地址改變了,因此在這裏咱們默認進行了一次淺拷貝,只拷貝了指針。內存

  • 方案二:copy可變的字符串字符串

NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"];
NSString*copyStr1 = [str1 copy];
NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1);
NSLog(@"str1 = %p copyStr1= %p",&str1,&copyStr1);

    輸出結果:str1 = 0x7fa522712cd0 copyStr1 = 0x7fa522717ba0
    指針地址:str1 = 0x7fff529e9a98 copyStr1= 0x7fff529e9a90
    小結對可變字符串的copy,咱們默認進行了一次深拷貝,直接拷貝了對象。string

    方案三:mutableCopy不可變字符串的it

NSString*str2 = @"ccc";
NSMutableString *copyStr2 = [str2 mutableCopy];
NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);

    輸出結果:str2 = 0x10d216108 copyStr2 = 0x7fa522726290
    小結對於不可變字符串的mutableCopy咱們默認進行了深拷貝。io

 

3、結論

  • copy:由於copy默認返回的是不可變的,因此當咱們對一個不可變的字符串進行copy的時候,咱們只是拷貝了它的指針(淺拷貝)。當咱們對一個可變的字符串進行拷貝的時候,由於類型轉變了,咱們需對其進行深拷貝

  • mutableCopy:默認返回的是一個可變的對象,適用於可變的對象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。  不管對於可變的字符串仍是不可變的字符串進行mutableCopy,系統都默認進行深拷貝,那麼爲何對於相同類型的進行mutableCopy返回的仍然是新的對象呢,由於在這裏系統要保證,舊的對象和新的對象都是可變的,切他們以前不會相互影響。

注:通過copy後返回的對象都是不可變的,若是被copy的對象也是不可變的,那麼不會從新分配內存,若是被copy的對象是可變的,那麼會從新分配內存;通過mutableCopy後返回的對象是可變的,不管被mutableCopy的對象是否可變,那麼都會從新分配內存

相關文章
相關標籤/搜索