對(duì)可變?nèi)萜黝愋蛯?duì)象和不可變?nèi)萜黝愋蛯?duì)象.array, mutableArray,dictionary,mutableDictionary.分別copy和mutableCopy時(shí),有什么區(qū)別.
像這種死的東西, 寫段代碼,測(cè)試一下就真相大白了
NSString* string = [NSString stringWithFormat:@"sfgasfasgfasgsdgfseg"];
NSLog(@"string 的地址是:%p",string);
NSArray* array = [NSArray arrayWithObjects:string, nil];
NSLog(@"array的地址是:%p, 第一個(gè)元素的地址是:%p",array,array[0]);//從輸出結(jié)果我們可以知道,數(shù)組中存放的就是元素的地址.
NSMutableArray* mutableArray = [NSMutableArray arrayWithObjects:string, nil];
NSLog(@"mutableArray的地址是:%p, 第一個(gè)元素的地址是:%p",mutableArray,mutableArray[0]);
//不變數(shù)組的深淺拷貝
NSArray* copyArray = [array copy];
//淺拷貝
NSLog(@"copyArray 的地址是:%p",copyArray);
//深拷貝
NSArray* mutableCopyArray = [array mutableCopy];
NSLog(@"mutableCopyArray 的地址是:%p",mutableCopyArray);
//可變數(shù)組的深淺拷貝
//淺拷貝
NSMutableArray* copyMutableArray = [mutableArray copy];
// [copyMutableArray addObject:@"崩!"];//代碼會(huì)崩.
NSLog(@"copyMutableArray 的地址是:%p, 第一個(gè)元素的地址是:%p",copyMutableArray,copyMutableArray[0]);
//深拷貝
NSMutableArray* mutableCopyMutableArray = [mutableArray mutableCopy];
[mutableCopyMutableArray addObject:@"我不會(huì)崩"];
NSLog(@"mutableCopyMutableArray 的地址是:%p, 第一個(gè)元素的地址是:%p",mutableCopyMutableArray,mutableCopyMutableArray[0]);
/*****那么數(shù)組的深淺拷貝又有什么區(qū)別呢?*****/
//答:對(duì)copy來(lái)的可變對(duì)象,執(zhí)行增,刪操作. 會(huì)崩,因?yàn)閳?zhí)行copy操作,得到的是對(duì)象副本是不可變的.
/** array不用copy修飾可以嗎?*/
//像這樣:
NSArray* testArray = mutableArray;
[mutableArray addObject:@"add"];
NSLog(@"testArray 的地址是:%p,內(nèi)容是:%@",testArray,testArray);//這就出問(wèn)題了. 出現(xiàn)了我們不想要的結(jié)果.我們的不可變數(shù)組,如今的內(nèi)容卻改變了.
代碼運(yùn)行結(jié)果
看完代碼,相信會(huì)解決你的疑惑. 不想看直接看下面結(jié)論! 不過(guò)還是希望你看看代碼.
結(jié)論:
- 容器類型對(duì)象存放的都是其元素的地址.
- copy和mutableCopy在針對(duì)可變?nèi)萜黝愋偷膶?duì)象和不可變?nèi)萜黝愋蛯?duì)象的執(zhí)行結(jié)果是不一樣的.針對(duì)不可變?nèi)萜黝愋?copy是淺復(fù)制.只復(fù)制對(duì)象的地址,存放副本.而可變?nèi)萜黝愋?則會(huì)新開(kāi)辟一塊內(nèi)存.
- 對(duì)于mutableCopy,針對(duì)可變?nèi)萜黝愋秃筒豢勺內(nèi)萜黝愋?都是在內(nèi)存中開(kāi)辟一塊內(nèi)存,存放副本.所謂:深復(fù)制,其實(shí)也不深,復(fù)制的內(nèi)容都還是其元素的地址.
- 使用copy得到的內(nèi)存是不可變的(對(duì)象不可變),mutableCopy是可變的(內(nèi)存可變). so不可以mutableCopy一個(gè)mutableArray.當(dāng)添加元素的時(shí)候,會(huì)崩!
- 不可以使用strong修飾array. 其他不可變?nèi)萜黝愋鸵惨粯? 以防其子類可變?nèi)萜黝愋偷膶?duì)象,間接改變對(duì)象.