iOS OC中copy和mutableCopy的使用区别

从Vivado工程到上板运行:手把手用Petalinux为你的Zynq-7000构建第一个Linux系统 本文详细介绍了如何使用Petalinux工具为Zynq-7000开发板构建Linux系统,从Vivado工程到上板运行的完整流程。内容包括Petalinux安装、项目创建、硬件设计导入、系统配置与构建,以及部署与启动验证。通过实战步骤和调试技巧,帮助开发者快速掌握FPGA SoC的嵌入式Linux开发。 阅读详情

iOS OC中copy和mutableCopy的使用区别

// 浅复制
- (IBAction)shallowCopyAction:(id)sender {
    NSArray *array0 = @[@"A", @"B", @"C"];
    NSArray *array1 = array0;
    NSArray *array2 = [array0 copy];
    NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
    NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
    NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
    array0 = @[@"OK", @"YES", @"NO"];
    NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
    NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
    NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
}

打印输出:

2020-04-02 21:12:06.775103+0800 CopyDemo[1158:20138] array0 = (
    A,
    B,
    C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775339+0800 CopyDemo[1158:20138] array1 = (
    A,
    B,
    C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775487+0800 CopyDemo[1158:20138] array2 = (
    A,
    B,
    C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775605+0800 CopyDemo[1158:20138] array0 = (
    OK,
    YES,
    NO
) 指针地址 = 0x600002880e70
2020-04-02 21:12:06.775713+0800 CopyDemo[1158:20138] array1 = (
    A,
    B,
    C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775823+0800 CopyDemo[1158:20138] array2 = (
    A,
    B,
    C
) 指针地址 = 0x600002880de0

分析:
我们可以看到,在array0赋值成@[@“OK”, @“YES”, @“NO”]之前,array0、array1和array2都指向同一块内存空间,内容自然也相同。

(1) array1 = array0,所以array1和array0指向同一块内存空间
(2) copy操作如果来源对象是否可变,如果来源对象是不可变对象(NSArray),则只拷贝指针,也就是浅拷贝;


array0赋值成@[@“OK”, @“YES”, @“NO”]之后:
(1) array0指向了新的一块内存空间,也就是@[@“OK”, @“YES”, @“NO”]的内存空间;
(2) 而array1和array2仍指向之前的一块内存空间,也就是@[@“A”, @“B”, @“C”]的内存空间,所以内容还是@[@“A”, @“B”, @“C”]

// 深复制
- (IBAction)deepCopyAction:(id)sender {
    NSArray *array0 = @[@"A", @"B", @"C"];
    NSMutableArray *array1 = [array0 mutableCopy];
    NSMutableArray *array2 = array1;
    NSMutableArray *array3 = [array1 mutableCopy];
    NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
    NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
    NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
    NSLog(@"array3 = %@ 指针地址 = %p", array3, array3);
    array0 = @[@"OK", @"YES", @"NO"];
    [array1 addObject:@"D"];
    NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
    NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
    NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
    NSLog(@"array3 = %@ 指针地址 = %p", array3, array3);
}

打印输出:

2020-04-02 21:17:57.474876+0800 CopyDemo[1158:20138] array0 = (
    A,
    B,
    C
) 指针地址 = 0x600002880e40
2020-04-02 21:17:57.475197+0800 CopyDemo[1158:20138] array1 = (
    A,
    B,
    C
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.475409+0800 CopyDemo[1158:20138] array2 = (
    A,
    B,
    C
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.475544+0800 CopyDemo[1158:20138] array3 = (
    A,
    B,
    C
) 指针地址 = 0x600002880ae0
2020-04-02 21:17:57.475714+0800 CopyDemo[1158:20138] array0 = (
    OK,
    YES,
    NO
) 指针地址 = 0x60000289cfc0
2020-04-02 21:17:57.475853+0800 CopyDemo[1158:20138] array1 = (
    A,
    B,
    C,
    D
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.475990+0800 CopyDemo[1158:20138] array2 = (
    A,
    B,
    C,
    D
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.476128+0800 CopyDemo[1158:20138] array3 = (
    A,
    B,
    C
) 指针地址 = 0x600002880ae0

分析:
(1) array0 = @[@“A”, @“B”, @“C”]; array0指向@[@“A”, @“B”, @“C”]的内存空间,地址为0x600002880e40
(2) copy操作如果来源对象是可变对象(NSMutableArray),则拷贝对象内容,也就是深拷贝
array1 = [array0 mutableCopy]; array1重新开辟一块内存空间,拷贝array0的内容,新的地址是0x600002880e10
(3) array2 = array1; array2和array1指向同一块内存空间,内容相同,地址是0x600002880e10
(4) array3 = [array1 mutableCopy],array3重新开辟一块内存空间,拷贝array1的内容,新的地址是0x600002880ae0


在array0 = @[@“OK”, @“YES”, @“NO”];
[array1 addObject:@“D”];
这两行语句之前:
(1) array0 = @[@“A”, @“B”, @“C”]; array0指向@[@“OK”, @“YES”, @“NO”]的内存空间,地址变成新的地址0x60000289cfc0
(2) [array1 addObject:@“D”];array1增加一个新的元素@“D”,内容变成@[@“A”, @“B”, @“C”, @“D”]。地址不变,仍是0x600002880e10
(3) array2和array1指向同一块内存空间,内容、地址和array1一样
(3) array3的地址和array1不一样,不受影响。内容还是@[@“A”, @“B”, @“C”]

特斯拉 Model 3解析(八)全面拆解特斯拉自动驾驶大脑:AP控制器硬核技术解析 算力极限:双FSD = 144 TOPS,专为AI推理优化。存储架构:LPDDR4 + NAND + NOR,保证高速/可靠启动。通信架构:以太网传视频,CAN传控制,TSN保障实时性。感知输入:多路摄像头 + 高速SerDes,满足全景感知。电源设计:功率模块+被动元件海洋,稳定性优先。功能安全:双芯片冗余 + GPS + 紧急呼叫,容错率极高。🎯 在我看来,特斯拉AP控制器就是一台“车载超算”,它在电源设计、存储架构和功能安全上远超一般新势力方案。 阅读详情

相关推荐

单片机笔记十二:华大HC32L136超低功耗设计实战

本文详细介绍了华大HC32L136单片机的超低功耗设计实战,包括深度睡眠模式下仅0.5μA的电流消耗、五种功耗模式的对比与配置、外设使用技巧及硬件级优化方法。通过实际项目案例,展示了如何利用ARM Cortex-M0+内核的HC32L136显著延长电池寿命,适用于智能门锁、额温枪等低功耗设备。

weixin_29189373的博客 392

21-OC中的copy使用

OC中的copy使用 /*      copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary),只能用不可变对象接收      mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary),只能用可变对象接收

blaze747 401

网络安全学习路线是怎样的?

为什么要学习安全? 近几年网络安全事件层出不穷,相信大家哪怕没遇到过,但也听过不少了吧。如服务器遭受入侵被黑,用户帐号被盗;被钓鱼、勒索病毒等,这些一旦发生,对企业而言都是不小的打击。因此,网络安全不容忽视,同时随着时代的不断发展,公司对于运维及网络工程师要求也越来越严格。未来越来越吃香的一定是技能方向广的复合型人才。网络安全可以说是一条非常好的发展道路。 今年两会期间,全国政协委员,360集团创始人、董事长周鸿祎提交了关于网络安全行业特殊人才的提案,为广大白帽子人员争取更好...

网安技术分享 8697

oc中的copy与mutableCopy

oc中的copy与mutableCopy oc中有两种对象,一种是可变对象,一种是不可变对象;还有两种对象拷贝方式:copy和mutableCopy 可变对象可以修改,不可变对象不可被修改 copy的结果是生成一个不可变对象,mutableCopy的结果是生成一个可变对象 分为以下四种情况进行讨论: 1.对不可变对象进行copy,结果仍然是不可变对象,

dream328的专栏 384

Windows系统下LaTeX环境搭建与编辑器配置全攻略

本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。

weixin_42554408的博客 449

利用Ghidra与SVD插件实现STM32固件深度逆向分析

本文详细介绍了如何利用Ghidra逆向工程框架结合SVD插件,实现对STM32固件(.bin文件)的深度逆向分析。通过加载描述芯片外设寄存器的SVD文件,Ghidra能将晦涩的硬件地址操作转换为可读的寄存器符号,极大提升了对嵌入式固件中通信协议、安全校验等关键逻辑的分析效率。文章涵盖了从Java环境搭建、工具配置到实战逆向解析的完整流程。

peach的博客 942

OC的copy与mutableCopy剖析(copy篇)

提示:OC中的字符串有NSString(不可变)和NSMutableString(可变)两类,其中后者是前者的子类。本文通过分析不同种类字符串的内存地址以及对象方法得出copy、mutableCopy的相关特性copy篇: 我们知道一个NSString类型的字符串可能会位于内存的常量区,堆区或者棧区(详情请参考博文Mac下NSString(不可变字符串)内存分析) 字符串str1,str2,

筱锐 832

Linux Wireless之80211(nl80211, cfg80211, mac80211)

Linux Wireless之80211(nl80211, cfg80211, mac80211)前言在Linux无线子系统中,cfg80211、mac80211和nl80211是三个关键的组件,它们共同工作以实现对802.11设备的配置和管理。cfg80211负责内核空间的通用API,mac80211负责具体的MAC层实现,而nl80211则作为用户空间与内核空间之间的桥梁,用于配置管理和通信。Netlink 是一个 Linux 中的 socket 类型,用于在内核与用户空间之间传递事件。

DD'Notes 1479

IOS 中 赋值、copy、MutableCopy的区别

赋值:地址值直接连接 copy:浅拷贝,会创建新的内存空间,并将旧的数据的地址值指向新的内存空间,当新的数据修改时候旧的也会修改,但是当新增对象的时候只会添加某一个对象。 Mutable Copy:深拷贝,会创建两个完全独立的内存空间,数据值一样。 画图表示: 以上为个人推论,未经证实。好像现实情况不是这样的,比如使用MutableCopy的确拷贝了数据,但是内存值

编程是一门艺术 4539

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1922

本地部署 Anything LLM+Ollama+DeepSeek R1 大模型并实现外部访问

DeepSeek 一经发布就引起社会的广泛的关注,因为 DeepSeek 的价格低廉,性能卓越,提供了多种使用方式,满足不同用户的需求和场景。本文将详细的介绍如何在本地 Windows 上安装部署 Anything LLM + Ollama 来实现用户和 DeepSeek-r1 对话的功能以及利用路由侠内网穿透实现外网访问。

lyxnwct的博客 1895

iOS底层学习-day-25

iOS底层学习-day-25前言-OC-内存管理篇copy关键字 前言-OC-内存管理篇 我是一名iOS开发者, iOS底层 菜鸟的进阶之路30天。 copy关键字 拷贝的目的 产生一个副本对象,跟源对象互不影响 修改了源对象,不会影响副本对象 修改了副本对象,不会影响源对象 iOS提供了2个拷贝方法 copy,不可变拷贝,产生不可变副本 mutableCopy,可变拷贝,产生可变副本...

weixin_41732253的博客 153

零差云控关节模组:EtherCAT+preempt-RT实现微秒级同步

关节模组是协作机器人、外骨骼与高精度服务机器人的核心执行单元,其性能瓶颈常在于多轴运动的时序一致性与实时闭环能力。实现‘零差’同步依赖于确定性通信(如EtherCAT)与硬实时操作系统支持(如Linux preempt-RT),前者保障指令与状态在微秒级时间戳下全局对齐,后者消除内核调度抖动,使PID控制、电流采样、编码器反馈等关键路径具备纳秒级可预测性。技术价值体现在相位偏差<±0.01°、端到端控制周期稳定1ms、连续运行温漂<±1.2℃等工程指标,广泛应用于力控装配、康复训练、远程遥操作等对动态精度与

weixin_34192816的博客 1197

20150619_OC之copy与mutableCopy

// // main.m // IOS150619_ObjectiveC_CopyAndMutableCopy // // Created by qianfeng on 15/6/19. // Copyright (c) 2015年 Peng Junlong. All rights reserved. // #import int main(int argc, const cha

nil Object的专栏 327

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OC copy内存管理语义及 copy mutableCopy

1、几点说明 说到NSCopying和NSMutableCopying协议,不得不说的就是copy和mutableCopy。 如果类想要支持copy操作,则必须实现NSCopying协议,也就是说实现copyWithZone方法; 如果类想要支持mutableCopy操作,则必须实现NSMutableCopying协议,也就是说实现mutableCopyWithZone方法; iOS系统中...

li198847的博客 518

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OC的消息发送以及转发机制

SEL:Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL.本质上,SEL只是一个指向方法的指针. Method:Method = SEL + IMP + method_types,相当于在SEL和IMP之间建立了一个映射 IMP:实际上是一个函数指针,指向方法实现的首地址        一、OC的消息机...

qq_28117621的博客 951

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OC-copy、深拷贝和浅拷贝的理解

深拷贝和浅拷贝的区别: 浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址 深拷贝是真正的复制了一份,复制的对象指向了新的地址 从上图可以看出,浅拷贝A指针改变了所指向的内容B指针也指向被修改后的内容。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝。可得出结论: 深拷贝: 拷贝出来的对象与源对象地址不一致! 这意味着我...

lyz0925的博客 745

linux cp 深拷贝,iOS中的copy,mutableCopy,深拷贝和浅拷贝

点赞再看,养成习惯,欢迎大家关注我面试小专栏 : iOS中高级进阶之路 有我准备的一线大厂面试资料和简历模板,欢迎Star!copy就是内容copy,比如NSString,copy就是新生成了一个对象;但是如果是NSArray,NSDictionary等,copy的是其对象的指针,并没有copy里面的内容,这种也叫做浅拷贝。深拷贝是神马呢?简单,就是把里面的内容也给拷贝了。以下copy和mutab...

weixin_29322049的博客 329

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

iOS的copy以及深拷贝浅拷贝

u013712343的博客 1189

iOS copy与mutableCopy

之前看到一篇文章 关于copy和mutableCopy的内容 感觉有点模糊了 就自己去简单尝试总结了一下: iOS中我们经常说拷贝分为浅拷贝和深拷贝,浅拷贝我们将其归结于指针的拷贝,拷贝后对象引用计数增加1,深拷贝是对象的拷贝,是将内容重新复制了一份,放在另一块内存地址中,新的对象引用计数为1,旧的对象引用计数不变。个人觉得现在xCode默认使用的arc,很少有人会去关注对象的引用计数,而且在a

蘅芜君 429

iOS copy mutableCopy详解

一、从面向对象到Objective-C概览copy 1、面向对象: In object-oriented programming, object copying is creating a copy of an existing object, a unit of data in object-oriented programming. The resulting object i

lcl12111211的专栏 1435

iOS开发之OC入门(copy)

即内容拷贝,指拷贝对象的具体内容,而内存地址是重新分配的,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。即指针拷贝,是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,但是拷贝可变对象为深拷贝。

weixin_46926959的博客 472

[OC-Foundation框架]--<Copy对象复制>

文章目录copy 与 mutableCopy 方法copy方法mutableCopy 方法mutableCopy 方法 copy方法的共同特点mutableCopy和copy 程序实例NScopying 与 NSmutableCopying 协议深复制和浅复制 copy 与 mutableCopy 方法 copy方法 copy 方法用于复制对象的副本,copy方法总返回对象的不可修改副本,即使该对象本身是可修改的 例如 :NSMutableString 的copy方法 返回不可修改的字符串对象 muta

weixin_61639290的博客 299

iOS学习之copy语法学习

iOS中如果想复制一个对象可以使用

smile_to_the_world的专栏 792

iOS copy的正确姿势

copy产生的对象一定是ns*对象(不可变对象),而mutableCopy产生的对象一定是nsMutable*对象(可变对象)只有ns* 调用copy得到的对象才是浅拷贝对象,其余搭配都是深拷贝对象** 注意copy得到的对象不一定是浅拷贝,但是mutableCopy一定是深拷贝 **

sgliquangang的专栏 608

retain,copy,assign,strong,weak,autorelease,nonatomic,atomic等得使用及区别

很多人对OC的内存管理不是很理解,对retain,copy,assign,strong,weak,autorelease,nonatomic,atomic等的使用以及区别不是很了解,本人根据自己的理解整理了这一份材料,希望对大家有所帮助。 retain assign copy在@property中的使用实际上是通过控制set方法进行内存管理。 1、 copy:建立一个索引计数为1的对象,

Paddy的个人博客 640
上一篇: OC NSString在@property中strong和copy的区别
下一篇: IOS 深复制(深拷贝)和浅复制(浅拷贝)
数智客栈
博客等级 码龄17年 5699粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值