IOS - 深入理解 深拷贝 与 浅拷贝

iOS经典面试题大全 1.INTERVIEW 共勉 2.INTERVIEW 准备 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 与2800+iOS开发者一起交流学习成长! 3.iOS developers 方向 4.INTERVIEW QUESTION 4... 阅读详情

OC 数组中的深拷贝与浅拷贝

浅拷贝:即指针拷贝,源对象和新对象指向的是同一个地址,也就是说浅拷贝要复出出来一个新的文件,但两个文件的地址还是一个。浅拷贝的话是只有不可变数组(如:NSArray,NSSet,NS字典)遇上copy,才是浅拷贝,剩下的都是深拷贝。

Dog * dog1 = [Dog new];
// 这里就是浅拷贝,即指针拷贝
Dog * dog2 = dog1;

深拷贝,自己定义的类一般需要遵循 NSCopying, NSMutableCopying 协议

Dog.h

@interface Dog : NSObject<NSCopying, NSMutableCopying>
@property (nonatomic) NSInteger age;
@end
Dog.m

@implementation Dog
- (id)copyWithZone:(NSZone *)zone
{
    Dog * dog = [[self class] allocWithZone:zone];
    dog.age = self.age;
    return dog;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    Dog * dog = [[self class] allocWithZone:zone];
    dog.age = self.age;
    return dog;
}

- (NSString *) description {
    return [NSString stringWithFormat:@"dog age: %ld", self.age];
}

@end
main.m

Dog * dog1 = [Dog new];
dog1.age = 5;

NSLog(@"dog1: %p, %@", dog1, dog1);

// mutableCopy 返回的是可变对象,自然可以设置对象的属性值
Dog * dog2 = [dog1 mutableCopy];
dog2.age = 10;

// copy 返回的对象也可以设置对象的属性值
// 所以,从这里来看,其实自定义实现的 copy 和 mutableCopy 功能是一致的,都是返回可变对象的
Dog * dog2 = [dog1 copy];
dog2.age = 10;

NSLog(@"dog2: %p, %@", dog2, dog2);


OC 可变数组中的深拷贝与浅拷贝

“数组中只是存储了对象的地址,而非存储了对象的本体。”

所以,对数组进行深拷贝之后,其中对象的地址确实被重新创建。

NSMutableArray * arr1 = [NSMutableArray new];

for (int i = 0; i < 3; i++) {
    Dog * dog = [Dog new];
    [arr1 addObject:dog];
}

NSLog(@"arr1: %p, %@", arr1, arr1);
NSMutableArray * arr2 = [arr1 mutableCopy];
NSLog(@"arr2: %p, %@", arr2, arr2);
运行结果:
2017-010-10 10:55:39.895 深拷贝与浅拷贝[901:303] arr1: 0x1001089c0, (
    "<Dog: 0x100108430>",
    "<Dog: 0x100109fc0>",
    "<Dog: 0x100109fd0>"
)
2017-10-10 10:55:39.917 深拷贝与浅拷贝[901:303] arr2: 0x100301ad0, (
    "<Dog: 0x100108430>",
    "<Dog: 0x100109fc0>",
    "<Dog: 0x100109fd0>"
)

因为 “数组中只是存储了对象的地址,而非存储了对象的本体。”所以,Dog 对象的空间并没有被复制。

因此,可变数组的 “深拷贝”并没有将其中所有元素都复制,其中的对象元素只进行了浅复制!

解决方法:重新将所有对象都拷贝一份

NSMutableArray * arr2 = [NSMutableArray new];
for (int i = 0; i < arr1.count; i++) {
    Dog * newDog = [arr1[i] copy];
    [arr2 addObject:newDog];
}

NSLog(@"arr2: %p, %@", arr2, arr2);

OC中对于数组的深拷贝,不能想当然地认为,已经将其中元素空间都拷贝了。实际上,其中的元素只是浅拷贝而已!

如果需要实现深拷贝的话,可以通过一个一个元素进行深拷贝,重新添加到可变数组中!


COPY 返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本。

NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];
NSMutableArray *array1=[array copy];
[array1 addObject:@"three"];  //error
NSMutableArray *array2=[array mutableCopy];
[array2 addObject:@"three"];  //right
// insert code here...
NSLog(@"Hello, World!");


比较与区别

复制对象的基本概念:复制一个对象为副本,开辟一块新的内存来存储副本对象。

如果一个对象想具备复制的功能,必须实现协议和协议

NSObject自带的常用的对象有:NSNumber、NSString、NSArray、NSDictionary、NSMutableArray、NSMutableDictionay、NSMutableString,copy产生的对象时不可变的,mutableCopy产生的对象时可变的

COPY和MutableCopy的区别

COPY 返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本。


浅copy和深copy

浅复制尽复制对象本身,对象里的属性、包含的对象不做复制。

浅复制只是复制指针,并没有创建新的内存空间。

深复制复制全部,包括对象的属性和其他对象

Foundation框架支持复制的类,默认是浅复制


对象的自定义拷贝

对象拥有复制特性,必须实现NSCopying,NSMutableCopying协议,实现该协议的copyWithZone方法和mutableCopyWithZone方法

深拷贝和浅拷贝的区别就在于copyWithZone方法的实现,


copy、mutableCopy和retain之间的关系

在Foundation对象中,copy是一个不可变的对象时,作用相当于retain

当使用mutableCopy时,不管源对象是否可变,副本是可变的,并且实现真正意义上的copy

当我们使用copy一个可变对象时,副本对象是不可变的。


NSFoundation,当我们copy的时一个不可变对象时,默认的copy都是浅拷贝,相当于retain

当使用mutableCopy时,不管对象是否可变,都会实现深拷贝

retain相当于两个对象指向同一个指针


总结:copy与mutableCopy:
copy:对于可变对象为深拷贝,对于不可变对象是浅拷贝。返回对象是否可变与被复制的对象保持一致。
mutableCopy:始终是深拷贝。始终返回一个可变对象。




深入理解iOS开发中的核心概念与框架 本篇博客深入探讨了iOS开发中众多核心概念,涵盖了Objective-C编程语言的内存管理、对象的复制与释放、数据类型与枚举、集合遍历与管理以及多线程编程等多个方面。文章通过详细解释特定代码片段和类方法的使用,以及它们在实际开发中的应用,为读者提供了一幅清晰的iOS开发知识图谱。 阅读详情

相关推荐

深拷贝与浅拷贝;copy与mutableCopy;容器类型的深拷贝;copy和strong;

1、只有NS类型调用copy方法才是浅拷贝,其他的情况全是深拷贝 2、容器类调用copy或mutableCopy能出现的深拷贝的情况下,只是容器的深拷贝,而非容器内元素的深拷贝 3、无论是声明NSString还是NSMutableString类型的属性时,我们希望此属性被赋值为NSMutableString类型的字符串后,此属性不会因这个可变类型字符串的改变而改变(这也是多数情况下的用法),那就用copy修饰属性

iOS 深拷贝与浅拷贝详解

浅拷贝只是对object对象指针进行拷贝,不会开辟新的内存。与数据源指向的是同一内存。例如copyA = [A copy],capyA和A指向的是同一内存,A的值变化,copyA的值也会发生变化。 copy方法做的是浅拷贝。 深拷贝 深拷贝会开辟新的内容,然后对原数据进行复制,新object对象与数据源指向的是不同的内存,对数据源操作不会影响新object对象。例如 mutableCopyA = [A mutableCopy],mutableCopyA和A指向的是两块不同的内存,A的值

weixin_44544690的博客 2822

浅析iOS中的浅拷贝和深拷贝(copy和mutableCopy)

ios提供了copy和mutablecopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutablecopy就是复制了一个mutable的对象。本文给大家介绍iOS中的浅拷贝和深拷贝(copy和mutableCopy) ,感兴趣的朋友一起看看吧

iOS-深拷贝和浅拷贝

一、深拷贝(Deep Copy) 和浅拷贝(Shallow Copy) 浅拷贝:指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝

MinggeQingchun的博客 2848

在overleaf中使用bibtex引用参考文献

最近在挑选写tex的平台,挑来挑去,个人感觉overleaf给我带来的体验感是最舒适的。不过由于对内部的文件组织和make进行了一层封装,所以与一般的本地平台编译tex会有一点不同。此处写一下在overleaf中使用bibtex的方法。 在tex中使用bibtex引用文献是一件很舒适的事,毕竟这是tex的优点之一(要是tex比word难用,我干什么不去用word,hhh) 第一步,我们创建一个.bib文件,名字随便起,我这边起为reference.bib。 然后打开谷歌学术,搜索你想要引用的文章,并找到

锦恢的博客 4万+

RK3588设备树节点实战:从零配置音频与显示模块(ES8388+DSI0)

本文详细介绍了在RK3588平台上配置音频编解码器ES8388和显示接口DSI0的设备树节点实战。通过具体案例拆解设备树节点的编写逻辑与调试技巧,包括音频路由与声卡配置、DSI控制器基础配置、视频通路路由配置以及电源管理与时钟树设计。文章还提供了调试工具与实战技巧,帮助开发者快速解决常见问题。

weixin_42525637的博客 353

【iOS】深拷贝与浅拷贝

在前面学习NSString的三种实现方式的过程中,遇到了深浅拷贝的问题,特此撰写博客总结知识浅复制是指创建一个新对象,该对象与原始对象共享内部数据的引用。换句话说,浅复制只复制对象本身,而不复制对象所引用的数据。因此,原始对象和副本对象指向同一块内存,对其中一个对象的修改会影响另一个对象。通俗的讲,浅复制就是仅仅创建一个存放与复制对象相同地址的指针变量,也可以称为指针拷贝深复制是指创建一个新对象,并复制原始对象及其引用的所有数据。深复制会递归地复制对象的所有内容,包括对象所引用的其他对象。

weixin_72437555的博客 1393

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示

本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。

night的博客 851

iOS中的浅拷贝与深拷贝

在iOS中分为浅拷贝和深拷贝。浅拷贝是指针复制,与源对象指向同一内存地址,源对象的引用计数器会+1。深拷贝是内容拷贝,两个对象内容相同,新的对象 retain 为 1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy 会减少对象对上下文的依赖。retain 属性表示两个对象地址相同,内容也相同,这个对象的引用计数器+1。2. 什么时候是深拷贝,什么时候是浅拷贝系统的非容器类对象指的是 NSString,NSNumber 这些不能包含其他对象的对象。在非容器类对象中。

老猿的自留地 790

波士顿咨询最新发布《2025年全球支付报告:未来不稳定》:到2029 年,支付收入将预计达到 2.4 万亿美元

波士顿咨询最新发布《2025年全球支付报告:未来不稳定》:到2029 年,支付收入将预计达到 2.4 万亿美元

face light~ 917

IPMItool 控制风扇转速

然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。

m0_37970303的博客 5061

iOS深拷贝与浅拷贝

简介 在大部分的编程语言中,都有深拷贝与浅拷贝的概念,如果使用深浅拷贝有误,可能会造成数据安全性的问题,那么本节针对OC中的深浅拷贝展开讨论 深拷贝与浅拷贝的概念 我们在进行实例对象操作时,无非是两种实例方式: 创建新对象后将原对象的内容拷贝一份,而后返回该对象 引用 深浅拷贝的区别由此产生: 深拷贝:重新开辟新的内存空间,完全拷贝该对象的值 浅拷贝:不重新开辟新的内存空间,引用该对象 以...

qq_39644268的博客 270

Codesys电子凸轮功能块MC_CamIn的masteroffset和slaveoffset参数的使用

问题1:在Codesys使用作轴电子凸轮时,MC_CamTableSelect的参数设置为MasterAbsolute=1,SlaveAbsolute=1,此设置为绝得模式, 此时主从轴当前位置都不为零时,此时Masteroffset=0、slaveOffset=0,凸轮启时出现突变,实轴无法启动。问题分析:在觉得模式下,主轴位置和从轴为是对应凸轮表的相位的,Masteroffset=0、slaveOffset=0,启动点时在主轴位置=0,从轴位置=0的点启动,此时主轴当前位置不为零则主从轴位置发生突变,

weixin_43587371的博客 1801

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

(原文地址:http://www.cnblogs.com/ydhliphonedev/archive/2012/04/27/2473927.html) 阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对

qq491100343的专栏 287

微信删除的聊天记录怎么恢复(2024年最新攻略合集)

随着微信对我们生活中方方面面的渗透,微信已然从一款简单的社交软件过渡成为现时代的一种生活方式,而微信中的聊天记录就是我们和朋友之间历程的最好证明。对此,今天我们来聊聊微信删除的聊天记录怎么恢复的问题。

m0_70960708的博客 945

小白也能轻松部署 OpenClaw:OpenClaw可视化部署工具+OpenClaw可视化管理工具分享

分享一个OpenClaw可视化一键部署工具,帮你快速打造属于自己的AI助手 🚀

XiaoqiangClub的博客 6711

深入理解深拷贝与浅拷贝

** 因为是怀着感恩的心进行转载所以并未配图,请跳转至原创作者连接查看 https://blog.youkuaiyun.com/jiang7701037/article/details/98738487 ** 深拷贝和浅拷贝是经常在面试中会出现的,主要考察你对基本类型和引用类型的理解深度。我在无数次的面试中,应聘者还没有一个人能把这个问题回答情况,包括很多机构的培训老师。这篇文章会让你把基本类型和引用类...

z_ZxpBK的博客 190

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IOS开发-深.浅拷贝与copy.strong

深.浅拷贝 copy/mutableCopy NSString NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSString *copyString = [string copy]; // 产生新对象 NSMutableString *mutableCopyString = [string mutableCopy]; NSLo...

aibi2462的博客 187

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS属性关键字And深浅拷贝再探究

代码】iOS属性关键字And深浅拷贝再探究。

weixin_61639290的博客 663

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深拷贝和浅拷贝

深拷贝和浅拷贝的测试

redyangred的博客 272

设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节。 比如说,有一个Person类,有firstName、lastName、friends这三个属性,代码如下: 1 2 3 4 5 6 7 8 9 10

SHTLoveXX的专栏 1117

探索Objective-C中的对象复制:深入理解copy和mutableCopy

iOS的copy以及深拷贝浅拷贝

u013712343的博客 1190

《招一个靠谱的移动开发》iOS面试题及详解(下篇)

iOS面试知识点 现在进入本篇的正题。本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背。死记硬背很快也会忘记的。 1 iOS基础 1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向

Kryptons的技术博客 2393

iOS 内存管理面试题(是否了解 深拷贝 和 浅拷贝 的概念,集合类深拷贝如何实现)

简而言之: 1、对不可变的非集合对象,copy是指针拷贝,mutablecopy是内容拷贝 2、对于可变的非集合对象,copy,mutablecopy都是内容拷贝 3、对不可变的数组、字典、集合等集合类对象,copy是指针拷贝,mutablecopy是内容拷贝 4、对于可变的数组、字典、集合等集合类对象,copy,mutablecopy都是内容拷贝 但是,对于集合对象的内容复制仅仅是对对...

小丑鱼 257

iOS深复制和浅复制

1、copy关键字 1> 浅拷贝与深拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。 深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。 2> copy和mutableCopy copy:对于可变对象为深复制,引用计数不改变;对于...

weixin_33834075的博客 74
上一篇: iOS - 同一个View识别单击和双击手势
下一篇: 进程间通信(IPC)介绍
喵星人Xcode
博客等级 码龄11年 235粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值