淺拷貝:
淺拷貝就是對(duì)內(nèi)存地址的復(fù)制歪玲,讓目標(biāo)對(duì)象指針和源對(duì)象指向同一片內(nèi)存空間。
深拷貝:
深拷貝是指拷貝的具體對(duì)象的內(nèi)容掷匠,而內(nèi)存地址是自助分配的滥崩,拷貝結(jié)束之后,兩個(gè)對(duì)象雖然存在的值是相同的讹语,但是內(nèi)存地址不一樣钙皮,兩個(gè)對(duì)象也互不影響,互不干涉顽决。
非容器不可變對(duì)象:
//非容器不可變對(duì)象
NSString *str = @"teststr"; //1
NSString *strCopy = [str copy]; //2
NSMutableString *strMCoppy = [str mutableCopy];//1
[strMCoppy appendString:@"oo"];//no error
NSLog(@"str-p = %p",str); //0x100001030
NSLog(@"strCopy-p = %p",strCopy); //0x100001030
NSLog(@"strMCopy-p = %p",strMCoppy); //0x100506a20
copy復(fù)制的是指針短条,mutableCopy生成新的內(nèi)存地址,并且返回的對(duì)象為可變對(duì)象
非容器可變對(duì)象:
//非容器可變對(duì)象
NSMutableString *mStr = [NSMutableString stringWithFormat:@"testStr"];
NSString *strCopy = [mStr copy];
NSMutableString *mStrCopy = [mStr copy];
NSMutableString *mStrMCopy = [mStr mutableCopy];
[mStrCopy appendString:@"0"];//error
[mStrMCopy appendString:@"0"];//no error
NSLog(@"mStr-p = %p",mStr); //0x1001065d0
NSLog(@"strCopy-p = %p",strCopy); //0x7274537473657475
NSLog(@"mStrCopy-p = %p",mStrCopy); //0x7274537473657475
NSLog(@"mStrMCopy-p = %p",mStrMCopy); //0x1001067f0
1.copy對(duì)可變對(duì)象非容器類為深拷貝才菠。(對(duì)象地址為何是同一個(gè)茸时??赋访?)
2.mutableCopy對(duì)可變非容器類為深拷貝可都。
3.copy產(chǎn)生的對(duì)象返回的為不可變。
容器類非可變對(duì)象
//容器類不可變對(duì)象
NSArray *array1 = [NSArray arrayWithObjects:@"a",@"b",@"c", nil];
NSArray *arrCopy1 = [array1 copy]; //指針復(fù)制
NSMutableArray *mArrCopy1 = [array1 mutableCopy]; //對(duì)象復(fù)制(里面的元素為指針復(fù)制)
NSLog(@"array-p = %p",array1); //0x1002043c0
NSLog(@"arrCopy-p = %p",arrCopy1); //0x1002043c0
NSLog(@"mArrCopy-p = %p",mArrCopy1); //0x100203900
NSArray *array2 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c", nil];
NSArray *arrCopy2 = [array2 copy]; //指針復(fù)制
NSMutableArray *mArrCopy2 = [array2 mutableCopy]; //對(duì)象復(fù)制(里面的元素為指針復(fù)制)
NSLog(@"array-p = %p",array2); //0x100105c50
NSLog(@"arrCopy-p = %p",arrCopy2); //0x100105c50
NSLog(@"mArrCopy-p = %p",mArrCopy2); //0x100106f60
//由此可見蚓耽,對(duì)于容器而言渠牲,其元素對(duì)象始終是指針復(fù)制。如果需要元素對(duì)象也是對(duì)象復(fù)制步悠,就需要實(shí)現(xiàn)深拷貝签杈。
//http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Copying.html
NSArray *deepCopyArray=[[NSArray alloc] initWithArray: array2 copyItems: YES];
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: array2]];
NSLog(@"deepCopyArray-p = %p",deepCopyArray); //第一個(gè)元素對(duì)象復(fù)制,其他指針復(fù)制
NSLog(@"trueDeepCopyArray-p = %p",trueDeepCopyArray); //容器內(nèi)元素全部對(duì)象復(fù)制
結(jié)論:
1.copy:對(duì)于可變對(duì)象為深復(fù)制鼎兽;對(duì)于不可變對(duì)象是淺復(fù)制答姥,引用計(jì)數(shù)每次加一,始終返回不可變的對(duì)象接奈。(踢涌?)
2.mutableCopy:始終是深復(fù)制,始終返回一個(gè)可變對(duì)象序宦。
3.對(duì)于容器而言睁壁,其元素對(duì)象始終是指針復(fù)制。如果需要元素對(duì)象也是對(duì)象復(fù)制,就需要實(shí)現(xiàn)深拷貝潘明。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Copying.html