当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS深拷贝和浅拷贝解析

iOS深拷贝和浅拷贝解析

2018年09月20日  | 移动技术网IT编程  | 我要评论

小轩卡盟,儿女传奇之分身,邪魔导

ios深拷贝和浅拷贝解析。最近项目中遇到一些有关自定义对象的copy问题,今天在这里做一些记录。以便加深理解和记忆。

什么是深拷贝、浅拷贝?
深拷贝:指针赋值,且重新开辟内存,内容重新拷贝一份。 浅拷贝:指针赋值,指针指向的内容是同一个地址,内容的引用计数+1。
注意在浅拷贝的时候如果指针指向的内存区域被销毁,指向这片内存的指针都要重新定义不然会成为野指针。
1.非集合对象的copy与mutablecopy

1.1 nsstring

nsstring *string1 = @"str1";
//copy返回的是不可变对象,str2不能被修改,因此会发生崩溃
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

从打印的内容可以看的出来string1、string2内容的地址相同,而string1、string2指针的地址不同。string1、string3内容的地址和指针地址都不相同。可知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返回的是不可变对象,mstr2不能被修改,因此会发生崩溃
//[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

从打印的内容可以看的出来mstr1、mstr2、mstr3内容地址和指针地址都不相同。所以nsmutablestring的copy和mutablecopy都是深拷贝。且copy返回的对象是不可变对象

2. 集合对象

2.1 不可变对象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

从打印的内容可以看的出来arry1、arry2内容的地址相同,而arry1、arry2指针的地址不同。arry1、arry3内容的地址和指针地址都不相同。可知nsstring的copy为浅拷贝,mutablecopy为深拷贝

2.2 可变对象nsmutablearray

nsmutablearray *arry1 = [[nsmutablearray alloc] initwithobjects:@"value1", @"value2",nil];
nsmutablearray *arry2 = [arry1 copy];
//copy返回的是不可变对象,marry2不能被修改,因此会崩溃
//[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);

从打印的内容可以看的出来arry1、arry2、arry3内容地址和指针地址都不相同。所以nsmutablestring的copy和mutablecopy都是深拷贝。且copy返回的对象是不可变对象

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网