關於深淺拷貝問題

(1)針對NSString、NSNumber等非容器類型對象的拷貝 copy、mutableCopyspa

對於系統的非容器類對象指針

a、若是對一不可變對象複製,copy是指針複製(淺拷貝)和 mutableCopy 對象複製(深拷貝)code

eg: NSString *aString = @"MySting";對象

NSString *str1 = [aString copy];       // 淺拷貝 指針複製內存

NSString *str2 = [aString mutableCopy];    // 深拷貝  對象複製(分配新的內存)rem

b、若是是對可變對象複製,都是深拷貝,可是copy返回的對象是不可變的。it

須要注意的是:copy就是複製了一個imutable(不可變)的對象,而mutablecopy(可變的)就是複製了一個mutable的對象。io

(2)系統的容器類對象  NSArrayNSDictionary等,對於容器類自己,上面討論的結論也是適用的,須要探討的是複製後容器內對象的變化。table

eg:class

    NSMutableString *a = [@"a" mutableCopy];
    NSArray *array1 = [NSArray arrayWithObjects:a,@"b",@"c",nil];
    
    NSArray *arrayCopy1 = [array1 copy];
    //arrayCopy1是和array同一個NSArray對象(指向相同的對象),包括array裏面的元素也是指向相同的指針
    NSLog(@"array1 retain count: %lu",[array1 retainCount]);
    NSLog(@"array1 retain count: %lu",[arrayCopy1 retainCount]);
    NSMutableArray *mArrayCopy1 = [array1 mutableCopy];
    [mArrayCopy1 addObject:@"d"];
    [mArrayCopy1 removeObjectAtIndex:0];
    
    NSLog(@"Origin: %@",array1);
    NSLog(@"iCopy: %@",arrayCopy1);
    NSLog(@"mCopy: %@",mArrayCopy1);
    
    [a insertString:@"aa" atIndex:0];
    
    NSLog(@"Origin: %@",array1);
    NSLog(@"iCopy: %@",arrayCopy1);
    NSLog(@"mCopy: %@",mArrayCopy1);

第一次的打印結果爲

Origin: (

    a,

    b,

    c

)

iCopy: (

    a,

    b,

    c

)

mCopy: (

    b,

    c,

    d

)


第二次打印結果爲:

Origin: (

    aaa,

    b,

    c

)

iCopy: (

    aaa,

    b,

    c

)

mCopy: (

    b,

    c,

   d

)


對比第一第二次的結果能夠看出,array裏面存儲的是對象是指針,當指針指向的對象發生改變的時候,array輸出結果就發生了變化

因而可知,對於容器而言,其元素對象始終是指針複製。若是須要元素對象也是對象複製,就須要實現深拷

-若是容器的某一元素是不可變的,那你複製完後該對象仍舊是不能改變的,所以只須要指針複製便可。

NSArray* dArray = [NSKeyedUnarchiver unarchiveObjectWithData:

    [NSKeyedArchiver archivedDataWithRootObject: array]];  // 真正的深拷貝

相關文章
相關標籤/搜索