深浅复制

什么是深、浅复制

浅复制:只是指针指向所复制的对象,共用一段内存
深复制:完全拷贝一份对象,不共用内存

iOS中深、浅复制总结

copy mutableCopy
不可变对象(NSString、NSArray) 浅拷贝 深拷贝
可变对象(NSMutableString、NSMutableArray) 深拷贝 深拷贝

NSString测试

    NSString *str1 = [NSString stringWithFormat:@"abc"];
    NSString *str2 = str1.copy;
    NSString *str3 = str1.mutableCopy;
    NSLog(@"str1 = %p",str1);
    NSLog(@"str2 = %p",str2);
    NSLog(@"str3 = %p",str3);
//    2016-06-30 15:41:32.314 测试深复制,浅复制[1475:450106] str1 = 0xa000000006362613
//    2016-06-30 15:41:32.315 测试深复制,浅复制[1475:450106] str2 = 0xa000000006362613
//    2016-06-30 15:41:32.315 测试深复制,浅复制[1475:450106] str3 = 0x144624f40

NSMutableString测试

    NSMutableString *str1 = [NSMutableString stringWithFormat:@"abc"];
    NSMutableString *str2 = str1.copy;
    NSMutableString *str3 = str1.mutableCopy;
    NSLog(@"str1 = %p-%@",str1,str1);
    NSLog(@"str2 = %p-%@",str2,str2);
    NSLog(@"str3 = %p-%@",str3,str3);
//    2016-06-30 15:47:16.537 测试深复制,浅复制[1489:452181] str1 = 0x12552e7a0-abc
//    2016-06-30 15:47:16.537 测试深复制,浅复制[1489:452181] str2 = 0xa000000006362613-abc
//    2016-06-30 15:47:16.537 测试深复制,浅复制[1489:452181] str3 = 0x1255340b0-abc

NSArray测试

    NSArray *arr1 = [NSArray arrayWithObjects:@"a",@"b", nil];
    NSArray *arr2 =arr1.copy;
    NSArray *arr3 =arr1.mutableCopy;
    NSLog(@"arr1=%p",arr1);
    NSLog(@"arr2=%p",arr2);
    NSLog(@"arr3=%p",arr3);
//    2016-06-30 15:49:32.252 测试深复制,浅复制[1493:452752] arr1=0x125547bd0
//    2016-06-30 15:49:32.253 测试深复制,浅复制[1493:452752] arr2=0x125547bd0
//    2016-06-30 15:49:32.253 测试深复制,浅复制[1493:452752] arr3=0x125541420

NSMutableArray测试

    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"a",@"b", nil];
    NSMutableArray *arr2 =arr1.copy;
    NSMutableArray *arr3 =arr1.mutableCopy;
    NSLog(@"arr1=%p",arr1);
    NSLog(@"arr2=%p",arr2);
    NSLog(@"arr3=%p",arr3);
//    2016-06-30 15:52:23.191 测试深复制,浅复制[1500:453692] arr1=0x147d22960
//    2016-06-30 15:52:23.191 测试深复制,浅复制[1500:453692] arr2=0x147d05ff0
//    2016-06-30 15:52:23.191 测试深复制,浅复制[1500:453692] arr3=0x147d10c40

NSDictionary测试

    NSDictionary *dict1 = [NSDictionary new];
    NSDictionary *dict2 = dict1.copy;
    NSDictionary *dict3 = dict1.mutableCopy;
    NSLog(@"dict1=%p",dict1);
    NSLog(@"dict2=%p",dict2);
    NSLog(@"dict3=%p",dict3);
//    2016-06-30 15:55:03.152 测试深复制,浅复制[1504:454390] dict1=0x135d003f0
//    2016-06-30 15:55:03.153 测试深复制,浅复制[1504:454390] dict2=0x135d003f0
//    2016-06-30 15:55:03.153 测试深复制,浅复制[1504:454390] dict3=0x135d32690

NSMutableDictionary测试

    NSMutableDictionary *dict1 = [NSMutableDictionary new];
    NSMutableDictionary *dict2 = dict1.copy;
    NSMutableDictionary *dict3 = dict1.mutableCopy;
    NSLog(@"dict1=%p",dict1);
    NSLog(@"dict2=%p",dict2);
    NSLog(@"dict3=%p",dict3);
//    2016-06-30 15:55:44.300 测试深复制,浅复制[1507:454706] dict1=0x13c51cda0
//    2016-06-30 15:55:44.300 测试深复制,浅复制[1507:454706] dict2=0x13c603c90
//    2016-06-30 15:55:44.300 测试深复制,浅复制[1507:454706] dict3=0x13c55d8b0

测试数组内部元素在拷贝过程中是否发生改变

    NSMutableString *str1 = [NSMutableString stringWithFormat:@"str1"];
    NSLog(@"str1 地址=%p",str1);
  
    NSMutableString *str2 = [NSMutableString stringWithFormat:@"str2"];
    NSLog(@"str2 地址=%p",str2);
    NSMutableArray *mArr=[NSMutableArray arrayWithObjects:str1,str2, nil];
    NSLog(@"mArr 地址=%p",mArr);
    [[mArr objectAtIndex:0] appendString:@"append111"];
    NSLog(@":append111:%@",str1);
    NSLog(@"mArr[0] 地址=%p",[mArr objectAtIndex:0]);
    
    NSArray *copyArr = mArr.copy;
    [[mArr objectAtIndex:0] appendString:@"append222"];
    NSLog(@"append222:%@",str1);
    NSLog(@"copyArr 地址=%p",copyArr);
    
    NSLog(@"copyArr[0] 地址=%p",[copyArr objectAtIndex:0]);
    /*
    测试容器类数据指针问题[2987:2525070] str1 地址=0x608000264a80
    测试容器类数据指针问题[2987:2525070] str2 地址=0x60000026b280
    测试容器类数据指针问题[2987:2525070] mArr 地址=0x608000053e60
   测试容器类数据指针问题[2987:2525070] :append111:str1append111
    测试容器类数据指针问题[2987:2525070] mArr[0] 地址=0x608000264a80
    测试容器类数据指针问题[2987:2525070] append222:str1append111append222
    测试容器类数据指针问题[2987:2525070] copyArr 地址=0x60800003fa80
    测试容器类数据指针问题[2987:2525070] copyArr[0] 地址=0x608000264a80
*/

说明数组在copy过程中内容的指针还是指向了同一个地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容

  • 浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。 深 复 制:在复制操作时,对于被复制的对象至...
    紫云夕月阅读 377评论 0 0
  • 简单总结一下Objective-C中的深浅复制。 OC中的复制有retain,copy,mutable三种方法。分...
    KenZhangCn阅读 249评论 0 1
  • 什么是深浅复制 浅复制:浅复制就是复制一份引用,所有的引用对象都指向同一份数据,并且都可以修改这份数据. 深复制:...
    baiying阅读 302评论 0 0
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,521评论 0 1
  • 前言 从层次上来看,对象的复制可以简单地分为浅复制和深复制,顾名思义,浅复制是指只复制一层对象的属性,不会复制对象...
    Claiyre阅读 186评论 0 1