[Objective-C] Copy 和 MutableCopy
生活随笔
收集整理的這篇文章主要介紹了
[Objective-C] Copy 和 MutableCopy
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
看了幾篇文章,因為文章很新手向,所以內容很繁瑣。故整理一下重點,寫了測試程序去了解幾個知識點,不討論基本概念。新博客wossoneri.com傳送門
非集合類對象的copy與mutableCopy
//NSString & NSMutableStringNSString *strA = @"origin";NSLog(@"strA pointer: %p content: %@", strA, strA);NSString *strACopy = [strA copy];NSLog(@"strCopy pointer: %p content: %@", strACopy, strACopy);NSMutableString *strAMCopy = [strA mutableCopy];NSLog(@"strMCopy pointer: %p content: %@", strAMCopy, strAMCopy);NSMutableString *strB = [NSMutableString stringWithString:@"mutable string"];NSLog(@"strB pointer: %p content: %@", strB, strB);NSMutableString *strBCopy = [strB copy];NSLog(@"strBCopy pointer: %p content: %@", strBCopy, strBCopy);NSMutableString *strBMCopy = [strB mutableCopy];NSLog(@"strBMCopy pointer: %p content: %@", strBMCopy, strBMCopy);//輸出 strA pointer: 0x100003180 content: origin strCopy pointer: 0x100003180 content: origin strMCopy pointer: 0x100102e90 content: origin strB pointer: 0x100700510 content: mutable string strBCopy pointer: 0x100700570 content: mutable string strBMCopy pointer: 0x1006002c0 content: mutable string在非集合類對象中:對immutable對象進行copy操作,是指針復制,mutableCopy操作時內容復制;對mutable對象進行copy和mutableCopy都是內容復制。
結論
- [immutableObject copy] // 淺復制
- [immutableObject mutableCopy] //深復制
- [mutableObject copy] //深復制
- [mutableObject mutableCopy] //深復制
集合類對象的copy與mutableCopy
NSArray *arrayA = @[@[@"A", @"B"], @[@"C", @"D"]];NSLog(@"arrayA pointer:%p contentA:%p contentB:%p", arrayA, arrayA[0], arrayA[1]);NSArray *arrCopyA = [arrayA copy];NSLog(@"arrCopyA pointer:%p contentA:%p contentB:%p", arrCopyA, arrCopyA[0], arrCopyA[1]);NSMutableArray *arrMCopyA = [arrayA mutableCopy];NSLog(@"arrMCopyA pointer:%p contentA:%p contentB:%p", arrMCopyA,arrMCopyA[0], arrMCopyA[1]);NSMutableArray *arrayB = [NSMutableArray arrayWithObjects:@[@"A", @"B"], @[@"C", @"D"], nil];NSLog(@"arrayB pointer:%p contentA:%p contentB:%p", arrayB, arrayB[0], arrayB[1]);NSArray *arrCopyB = [arrayB copy];NSLog(@"arrCopyB pointer:%p contentA:%p contentB:%p", arrCopyB, arrCopyB[0], arrCopyB[1]);NSMutableArray *arrMCopyB = [arrayB mutableCopy];NSLog(@"arrMCopyB pointer:%p contentA:%p contentB:%p", arrMCopyB,arrMCopyB[0], arrMCopyB[1]);//輸出 arrayA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0 arrCopyA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0 arrMCopyA pointer:0x100700990 contentA:0x100700840 contentB:0x1007007c0arrayB pointer:0x100701970 contentA:0x100700880 contentB:0x100701730 arrCopyB pointer:0x100102080 contentA:0x100700880 contentB:0x100701730 arrMCopyB pointer:0x100701ab0 contentA:0x100700880 contentB:0x100701730可以看到拷貝過程和非集合類大體相同。注意一點,就是拷貝過程只是針對對象本身,而對象內部的元素還是指針復制,從上面打印的輸出就可以看出來。
示例
看如下代碼,有一個mutable數組,賦值給immutable數組
@property (nonatomic, strong) NSArray *array;NSMutableArray *mArray = [NSMutableArray array];[mArray addObject:@"AA"];_array = mArray;NSLog(@"mArray: %p, _array: %p", mArray, _array);[mArray addObject:@"BB"];NSLog(@"mArray = %@, _array = %@", mArray, _array);其中,直接對array屬性賦值,這樣,_array和mArray便是指向同一對象的指針,因為NSMutableArray是NSArray的子類,故_array能夠接受mArray的值。
輸出結果:
mArray: 0x126ec3e00, _array: 0x126ec3e00 mArray = (AA,BB ), _array = (AA,BB )下面做個修改,把
_array = mArray;改為
_array = [mArray copy];想想結果如何?
mArray是mutable對象,拷貝屬于(不完全)深拷貝,所以可以想到_array的指針和mArray并不相同,所以后面mArray改變內容也與_array無關。
輸出:
mArray: 0x154dc8070, _array: 0x154dcf4e0 mArray = (AA,BB ), _array = (AA )小結
Reference
小結 iOS 中的 copy
iOS 集合的深復制與淺復制
轉載于:https://www.cnblogs.com/rossoneri/p/5559882.html
總結
以上是生活随笔為你收集整理的[Objective-C] Copy 和 MutableCopy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数加减运算
- 下一篇: [AngularJS学习笔记] 基础学习