IOS 深拷貝淺拷貝

  • 非容器類對象

    1 . imutable對象

NSString *string = @"origion";
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];

變量地址

stringstringCopy指向同一段內(nèi)存,即淺拷貝。而mutableCopy內(nèi)存變化,為深拷貝

2 . mutable對象

 NSMutableString *string = [NSMutableString stringWithString: @"origion"];
NSString *stringCopy = [string copy];
NSMutableString *mStringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
//        [mStringCopy appendString:@"mm"];//error  -----> A
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];
變量地址

stringstringCopymStringCopystringMCopy四段內(nèi)存地址都不一樣,對于mStringCopy實(shí)際上是imutable對象,所以 A段代碼會報(bào)錯(cuò),因?yàn)樾薷牧薸mutable對象。所以對于 mutable對象(非容器類)copy和mutableCopy都是深拷貝,但是前者返回的對象imutable,不可修改

  • 容器類對象
  1. imutable容器
 NSArray *array = @[@"1",@"2",@"3"];
NSArray *arrayCopy = [array copy];
NSMutableArray *arrayMCopy = [array mutableCopy];
//[arrayMCopy addObject:@"4"];
//[arrayMCopy removeObjectAtIndex:0];
        
NSLog(@"obj address in array:%p at index 0 : %p",array, array[1]);
NSLog(@"obj address in arrayCopy:%p at index 0 : %p",arrayCopy,  arrayCopy[1]);
NSLog(@"obj address in mArrayCopy:%p at index 0 : %p",arrayMCopy, arrayMCopy[1]);
變量地址

我們再看個(gè)例子


NSArray *array2 = @[[NSMutableString stringWithString:@"a"],
                             @"b",
                             @"c"];
NSArray *arrayCopy2 = [array2 copy];
NSMutableArray *arrayMCopy2 = [array2 mutableCopy];
        
NSLog(@"obj address in array2:%p at index 0 : %p",array2, array2[0]);
NSLog(@"obj address in arrayCopy2:%p at index 0 : %p",arrayCopy2, arrayCopy2[0]);
NSLog(@"obj address in arrayMCopy2:%p at index 0 : %p",arrayMCopy2, arrayMCopy2[0]);
變量地址

可見 對imutable對象進(jìn)行copy是指針復(fù)制,進(jìn)行mutableCopy是對象復(fù)制,但是容器內(nèi)容始終都是指針復(fù)制

  2 .  mutable容器
NSMutableArray *mArray3 = [NSMutableArray arrayWithArray:@[@"1",
                                                           @"2",
                                                           @"3"]];
NSArray *mArrayCopy3 = [mArray3 copy];
NSMutableArray *mArrayMCopy3 = [mArray3 mutableCopy];
NSLog(@"obj address in mArray3:%p at index 0 : %p",mArray3, mArray3[1]);
NSLog(@"obj address in mArrayCopy3:%p at index 0 : %p",mArrayCopy3,  mArrayCopy3[1]);
NSLog(@"obj address in mArrayMCopy3:%p at index 0 : %p",mArrayMCopy3, mArrayMCopy3[1]);
變量地址

對于mutable容器,copy亦或是mutableCopy對于容器都是對象拷貝,對于容器內(nèi)容都是指針拷貝,并且copy返回imutable對象,mutableCopy返回mutable對象

總結(jié):

| copy | mutablecopy
----|------|----
不可變非容器對象 | 淺拷貝 | 深拷貝
可變非容器對象 | 深拷貝(返回不可變對象) | 深拷貝(返回可變對象)
不可變?nèi)萜鲗ο螅ㄈ萜鲀?nèi)容始終指針復(fù)制) | 淺拷貝(返回不可變對象) | 深拷貝(返回可變對象)
可變?nèi)萜鲗ο螅ㄈ萜鲀?nèi)容始終指針復(fù)制) | 深拷貝(返回不可變對象) | 深拷貝(返回可變對象)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容