天天看點

深拷貝&淺拷貝

今天說一下深拷貝和淺拷貝  

聲明本文僅供參考,因為作者能力有限不能做到十全十美,是以請大家指正錯誤的地方,歡迎大家提出問題,我回虛心接納!

copy的目的是建立一個對象的副本,對其中一個對象進行修改時,不會影響到另外一個對象中的内容

 在iOS中copy包括:copy(拷貝) &

mutableCopy(可變拷貝)

由于OC Foundation中對象類型通常包括不可變版本和可變版本,是以要試驗copy操作需要測試幾種形式:

 1> 可變 -> 可變

       位址變化(新副本)

 2> 可變 -> 不可變

 3> 不可變 -> 可變

       位址不變化

 4> 不可變 -> 不可變

      位址不變化

下面我們來看代碼:

void demoCopy1()

{   

 NSMutableString *strM = [NSMutableStringstringWithString:@"閃電霹靂"];

    // 1> 可變 -> 可變

    NSMutableString *strM1 = [strM

copy];

//    [strM1 setString:@"hello"]; 

    NSLog(@"%@ %p - %@ %p", strM, strM,

strM1, strM1);

    //

2> 可變

-> 不可變

    NSString *strM2 = [strM copy];

strM2, strM2);

    [strM setString:@"hello"];

}

這時候你會發現上面NSMutableSting拷貝過後就在strM1指派的時候就會報錯,第2>個也是給strM2指派的時候也回報錯

接下來再看案例2

void demoCopy2()

{

    NSString *str = @"閃電霹靂";

   //

1> 不可變

-> 可變

    NSMutableString *strM1 = [str

//    [strM1 setString:@"hello"];

    NSLog(@"%@ %p - %@ %p", str, str,

    // 2> 不可變 ->

不可變

    NSString *strM2 = [str copy];

 這時候同樣,不管是NSMutableString還是Nstring拷貝過後的都不能再改變,同樣不能指派,如果指派改變就會出錯;

結論:使用Copy建立出來的都是不可變的的副本,與建立的副本類型無關;

接下來看事例3

void demoCopy3()

    NSMutableString *strM =

[NSMutableStringstringWithString:@"可變字元串"];

1> 可變

mutableCopy];

    [strM1 setString:@"hello strM1"];

       // 2> 可變 ->

    NSString *strM2 = [strM

    id strM3 = strM2;

    [strM3 setString:@"hello strM2"];

      [strM setString:@"hello"];

 這次你回發現拷貝過後不管是哪一個類型都可改變;

結論:使用mutableCopy建立出來的都是可變副本,與建立副本的類型無關

好了,深拷貝淺拷貝到這裡就OK了,有沒有對copy有根深的一層了解呢?哈哈這裡恭祝大家天天進步!!如有疑問可以聯系我,我回盡自己的能力幫助大家!!