[Objective-C] Copy 和 MutableCopy
看了幾篇文章,因?yàn)槲恼潞苄率窒?#xff0c;所以內(nèi)容很繁瑣。故整理一下重點(diǎn),寫了測(cè)試程序去了解幾個(gè)知識(shí)點(diǎn),不討論基本概念。新博客wossoneri.com傳送門
非集合類對(duì)象的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在非集合類對(duì)象中:對(duì)immutable對(duì)象進(jìn)行copy操作,是指針復(fù)制,mutableCopy操作時(shí)內(nèi)容復(fù)制;對(duì)mutable對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制。
結(jié)論
- [immutableObject copy] // 淺復(fù)制
- [immutableObject mutableCopy] //深復(fù)制
- [mutableObject copy] //深復(fù)制
- [mutableObject mutableCopy] //深復(fù)制
集合類對(duì)象的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可以看到拷貝過程和非集合類大體相同。注意一點(diǎn),就是拷貝過程只是針對(duì)對(duì)象本身,而對(duì)象內(nèi)部的元素還是指針復(fù)制,從上面打印的輸出就可以看出來。
示例
看如下代碼,有一個(gè)mutable數(shù)組,賦值給immutable數(shù)組
@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);其中,直接對(duì)array屬性賦值,這樣,_array和mArray便是指向同一對(duì)象的指針,因?yàn)镹SMutableArray是NSArray的子類,故_array能夠接受mArray的值。
輸出結(jié)果:
mArray: 0x126ec3e00, _array: 0x126ec3e00 mArray = (AA,BB ), _array = (AA,BB )下面做個(gè)修改,把
_array = mArray;改為
_array = [mArray copy];想想結(jié)果如何?
mArray是mutable對(duì)象,拷貝屬于(不完全)深拷貝,所以可以想到_array的指針和mArray并不相同,所以后面mArray改變內(nèi)容也與_array無關(guān)。
輸出:
mArray: 0x154dc8070, _array: 0x154dcf4e0 mArray = (AA,BB ), _array = (AA )小結(jié)
Reference
小結(jié) iOS 中的 copy
iOS 集合的深復(fù)制與淺復(fù)制
轉(zhuǎn)載于:https://www.cnblogs.com/rossoneri/p/5559882.html
總結(jié)
以上是生活随笔為你收集整理的[Objective-C] Copy 和 MutableCopy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数加减运算
- 下一篇: 关于offsetTop offsetHe