引言
最近項(xiàng)目中遇到一些有關(guān)自定義對(duì)象的copy問(wèn)題闺魏,今天在這里做一些記錄未状。以便加深理解和記憶。
什么是深拷貝析桥、淺拷貝司草?
- 深拷貝:指針賦值,且重新開(kāi)辟內(nèi)存泡仗,內(nèi)容重新拷貝一份埋虹。
- 淺拷貝:指針賦值,指針指向的內(nèi)容是同一個(gè)地址娩怎,內(nèi)容的引用計(jì)數(shù)+1搔课。
注意在淺拷貝的時(shí)候如果指針指向的內(nèi)存區(qū)域被銷(xiāo)毀,指向這片內(nèi)存的指針都要重新定義不然會(huì)成為野指針截亦。
1.非集合對(duì)象的copy與mutableCopy
1.1 NSString
NSString *string1 = @"str1";
//copy返回的是不可變對(duì)象辣辫,str2不能被修改,因此會(huì)發(fā)生崩潰
NSString *string2 = [string1 copy];
NSLog(@"string1: %p %p,string2: %p %p",string1,&string1,string2,&string2);
NSMutableString *string3 = [string1 mutableCopy];
NSLog(@"string1: %p %p,string3: %p %p",string1,&string1,string3,&string3);
2017-08-03 20:26:26.450 TableViewTest[77698:6624676] string1: 0x10092e0f8 0x7fff5f2d5980,string2: 0x10092e0f8 0x7fff5f2d5978
2017-08-03 20:26:26.450 TableViewTest[77698:6624676] string1: 0x10092e0f8 0x7fff5f2d5980,string3: 0x608000077b00 0x7fff5f2d5970
從打印的內(nèi)容可以看的出來(lái)string1魁巩、string2內(nèi)容的地址相同,而string1姐浮、string2指針的地址不同谷遂。string1、string3內(nèi)容的地址和指針地址都不相同卖鲤∩鋈牛可知NSString的copy為淺拷貝畴嘶,mutablecopy為深拷貝
1.2 NSMutableString
NSMutableString *mstr1 = [NSMutableString stringWithString:@"test002"];
NSMutableString *mstr2 = [mstr1 copy];
NSLog(@"mstr1: %p %p,mstr2: %p %p",mstr1,&mstr1,mstr2,&mstr2);
//copy返回的是不可變對(duì)象,mstr2不能被修改集晚,因此會(huì)發(fā)生崩潰
//[mstr2 appendString:@"test"];
NSMutableString *mstr3 = [mstr1 mutableCopy];
//[mstr3 appendString:@"modify"];
NSLog(@"mstr1: %p %p,mstr3: %p %p",mstr1,&mstr1,mstr3,&mstr3);
2017-08-03 20:49:28.896 TableViewTest[78081:6667312] mstr1: 0x6000000767c0 0x7fff51c74980,mstr2: 0xa323030747365747 0x7fff51c74978
2017-08-03 20:49:28.896 TableViewTest[78081:6667312] mstr1: 0x6000000767c0 0x7fff51c74980,mstr3: 0x600000076800 0x7fff51c74970
從打印的內(nèi)容可以看的出來(lái)mstr1窗悯、mstr2、mstr3內(nèi)容地址和指針地址都不相同偷拔。所以NSMutableString的copy和mutableCopy都是深拷貝蒋院。且copy返回的對(duì)象是不可變對(duì)象
2. 集合對(duì)象
2.1 不可變對(duì)象NSArray
NSArray *arry1 = [[NSArray alloc] initWithObjects:@"value1", @"value2",nil];
NSArray *arry2 = [arry1 copy];
NSArray *arry3 = [arry1 mutableCopy];
NSLog(@"arry1: %p %p,arry2: %p %p",arry1,&arry1,arry2,&arry2);
NSLog(@"arry1: %p %p,arry3: %p %p",arry1,&arry1,arry3,&arry3);
2017-08-03 20:58:29.940 TableViewTest[78209:6684329] arry1: 0x608000223a00 0x7fff5f16f980,arry2: 0x608000223a00 0x7fff5f16f978
2017-08-03 20:58:29.940 TableViewTest[78209:6684329] arry1: 0x608000223a00 0x7fff5f16f980,arry3: 0x608000245280 0x7fff5f16f970
從打印的內(nèi)容可以看的出來(lái)arry1、arry2內(nèi)容的地址相同莲绰,而arry1欺旧、arry2指針的地址不同。arry1蛤签、arry3內(nèi)容的地址和指針地址都不相同辞友。可知NSString的copy為淺拷貝震肮,mutablecopy為深拷貝
2.2 可變對(duì)象NSMutableArray
NSMutableArray *arry1 = [[NSMutableArray alloc] initWithObjects:@"value1", @"value2",nil];
NSMutableArray *arry2 = [arry1 copy];
//copy返回的是不可變對(duì)象称龙,marry2不能被修改,因此會(huì)崩潰
//[arry2 addObject:@"value3"];
NSMutableArray *arry3 = [arry1 mutableCopy];
NSLog(@"arry1: %p %p,arry2: %p %p",arry1,&arry1,arry2,&arry2);
NSLog(@"arry1: %p %p,arry3: %p %p",arry1,&arry1,arry3,&arry3);
從打印的內(nèi)容可以看的出來(lái)arry1戳晌、arry2鲫尊、arry3內(nèi)容地址和指針地址都不相同。所以NSMutableString的copy和mutableCopy都是深拷貝躬厌。且copy返回的對(duì)象是不可變對(duì)象