iOS - copy、mutableCopy 的学习心得

最近看了网上很多人的博客和讲解,有些地方不是太明白、自己整理下
1、copy的对象 一般可以分为容器对象(例如Array类),和非容器对象(例如NSString类)。
2、一般常用的copy 数组、字典、字符串、类对象这些。下边会一个个的去研究
一、数组
(1)不可变数组

  NSArray *tempArr = [NSArray arrayWithObjects:@"111", nil];

  NSArray *tempArr2 = tempArr.copy;
  NSArray *tempArr3 = tempArr.mutableCopy;

  NSLog(@"指针地址:%p \n 对象实际地址:%p \n",&tempArr,tempArr);
  NSLog(@"指针地址:%p \n 对象实际地址:%p \n",&tempArr2,tempArr2);
  NSLog(@"指针地址:%p \n 对象实际地址:%p \n",&tempArr3,tempArr3);
指针地址:0x7ffeeac4bda8   对象实际地址:0x6000021b6cc0 
指针地址:0x7ffeeac4bda0   对象实际地址:0x6000021b6cc0 
指针地址:0x7ffeeac4bd98   对象实际地址:0x600002f19020 

不可变数组的copy,是浅copy,只是创建了一个新的指针,指向原指针指向的内存地址
不可变数组的mutableCopy,是深copy,创建了新的指针,并且开辟了新的内存,并将原内存的存在的元素copy了过来

(2)可变数组

    NSMutableArray *tempMutArr = [NSMutableArray array];
    [tempMutArr addObject:@"111"];

    NSMutableArray *tempMutArr2 = tempMutArr.copy;
    NSMutableArray *tempMutArr3 = tempMutArr.mutableCopy;

    NSLog(@"可变对象 指针地址:%p \n 对象实际地址:%p \n",&tempMutArr,tempMutArr);
    NSLog(@"可变对象 指针地址:%p \n 对象实际地址:%p \n",&tempMutArr2,tempMutArr2);
    NSLog(@"可变对象 指针地址:%p \n 对象实际地址:%p \n",&tempMutArr3,tempMutArr3);

    if ([tempMutArr2 isKindOfClass:[NSArray class]]) {

    }
 指针地址:0x7ffeee689da8  对象实际地址:0x6000001ceb80 
 指针地址:0x7ffeee689da0  对象实际地址:0x600000d4d5e0 
 指针地址:0x7ffeee689d98  对象实际地址:0x6000001cebb0 

可变数组的copy,是深copy,创建了新的指针,并且开辟了新的内存地址,并copy了原内存地址中存在的元素,但是可变数组经过copy后,变成了不可变数组,如果调用可变数组的方法,会造成crash

可变数组的mutableCopy,是深copy,也是创建了新的指针,开辟新的内存地址,但是,深copy后,还是可变数组,不会造成crash

二、字典
(1)不可变字典

   NSDictionary *tempDict = [NSDictionary dictionary];
   
   NSDictionary *tempDict2 = tempDict.copy;
   NSDictionary *tempDict3 = tempDict.mutableCopy;
 指针地址:0x7ffee5e91da8  对象实际地址:0x7fff806379a0 
 指针地址:0x7ffee5e91da0  对象实际地址:0x7fff806379a0 
 指针地址:0x7ffee5e91d98  对象实际地址:0x600003145ce0 

不可变字典的copy,是浅copy,只是创建了一个新的指针,指向原指针指向的内存地址
不可变字典的mutableCopy,是深copy,创建了新的指针,并且开辟了新的内存,并将原内存的存在的元素copy了过来

(2)可变字典

    NSMutableDictionary *tempDict = [NSMutableDictionary   dictionary];
    
    NSMutableDictionary *tempDict2 = tempDict.copy;
    NSMutableDictionary *tempDict3 = tempDict.mutableCopy;
指针地址:0x7ffee081dda8   对象实际地址:0x600000cdd240 
指针地址:0x7ffee081dda0   对象实际地址:0x600000cdd260 
指针地址:0x7ffee081dd98   对象实际地址:0x600000cdd280 

可变字典的copy,是深copy,创建了新的指针,并且开辟了新的内存地址,并copy了原内存地址中存在的元素,但是可变字典经过copy后,变成了不可变字典,如果调用可变字典的方法,会造成crash

可变字典的mutableCopy,是深copy,也是创建了新的指针,开辟新的内存地址,但是,深copy后,还是可变字典,不会造成crash

三、字符串
(1)不可变字符串

    NSString *tempStr = @"111";
    NSString *tempStr2 = tempStr.copy;
    NSString *tempStr3 = tempStr.mutableCopy;
 指针地址:0x7ffee8c9dda8   对象实际地址:0x106fa4d28 
 指针地址:0x7ffee8c9dda0   对象实际地址:0x106fa4d28 
 指针地址:0x7ffee8c9dd98   对象实际地址:0x60000305f570 

不可变字符串的copy,是浅copy,只是创建了一个新的指针,指向原指针指向的内存地址
不可变字符串的mutableCopy,是深copy,创建了新的指针,并且开辟了新的内存,并将原内存的存在的元素copy了过来

(2)可变字符串

    NSMutableString *tempStr = [[NSMutableString            alloc]initWithString:@"111"];
    NSMutableString *tempStr2 = tempStr.copy;
    NSMutableString *tempStr3 = tempStr.mutableCopy;

 指针地址:0x7ffee51a3da8  对象实际地址:0x600001304210 
 指针地址:0x7ffee51a3da0   对象实际地址:0xdff58c500f0097cb 
 指针地址:0x7ffee51a3d98   对象实际地址:0x600001304240 

可变字符串的mutableCopy,是深copy,也是创建了新的指针,开辟新的内存地址,但是,深copy后,还是可变字符换,不会造成crash

小结:对于可变对象的copy。copy后均为不可变对象,不可再使用可变对象的方法,因为oc是动态语言,所以编写时调用可变对象的方法不会报错,但是会在运行时发生crash

avatar

参考链接
https://www.jianshu.com/p/dcdb56829833

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

推荐阅读更多精彩内容

  • 拷贝:顾名思义就是将一个对象复制一份出来。说到iOS中得拷贝操作,大概用的最多的应该就是数组的拷贝操作。如果自己的...
    嚤仌啾啾阅读 1,619评论 2 25
  • 先说下概念,我们对变量的复制,其实就是在写代码的过程中,再定义多几个不同名字的变量,让他们都“等于”某一个变量,这...
    TonyGor阅读 107评论 0 0
  • 一、基本概念 就 iOS 开发而言,关于 copy 的几个概念: 拷贝:即复制,目的是产生副本,让原对象和副本相互...
    康小曹阅读 828评论 0 7
  • 今天遇到一个问题,由此引起copy和mutalbeCopy的区别,不深究不觉得自己不知道,随便一问就给问住了。正文...
    yidezhang阅读 1,020评论 0 0
  • 本文逻辑图 copy和mutableCopy赋值的异同1.copy,mutableCopy都是深拷贝,也就是会重新...
    壮了个壮阅读 948评论 0 4