OC中的copy和mutableCopy

2023-10-31

在OC中,对对象的拷贝可分为深拷贝和浅拷贝。

深拷贝,会生成新的指针和新的内存,新的指针指向新开辟的内存空间,并且会将原来的内存中的内容也拷贝过来。

浅拷贝,会生成新的指针,但是不会开辟新的内存空间,也不会拷贝原来内存中的内容。新生成的指针会指向之前的内存地址。

画个图来说明:

请添加图片描述
请添加图片描述

OC中,对对象的拷贝需看改对象本身是否是可变的。

对于可变对象的拷贝:

    NSMutableArray *muArr = [[NSMutableArray alloc] init];
    [muArr addObject:@"Value1"];
    [muArr addObject:@"Value2"];
    [muArr addObject:@"Value3"];
    NSLog(@"%@ %p %p",muArr, muArr, &muArr);

    NSArray *arr1 = [muArr copy];
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);

    NSMutableArray *arr2 = [muArr mutableCopy];
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);
    
    [arr2 addObject:@"Jerry"];


    NSLog(@"%@ %p %p",muArr, muArr, &muArr);
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);
  • 对可变对象使用copy或者mutableCopy,都是深拷贝,会生成新的指针对象,并开辟新的内存空间。

对于不可变对象拷贝:

    NSArray *arr = @[@"Value1",@"Value2",@"Value3"];
    NSLog(@"%@ %p %p",arr, arr, &arr);

    NSArray *arr1 = [arr copy];
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);

    NSMutableArray *arr2 = [arr mutableCopy];
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);

    [arr2 addObject:@"Tom"];
    
    NSLog(@"%@ %p %p",arr, arr, &arr);
    NSLog(@"%@ %p %p",arr1, arr1, &arr1);
    NSLog(@"%@ %p %p",arr2, arr2, &arr2);
  • 对不可变对象使用copy,会生成新的指针对象,但是不会开辟新的内存空间,是浅拷贝。
  • 对不可变对象使用mutableCopy,也会生成新的指针对象,而且会开辟新的内存空间,是深拷贝。

用一个图来总结:

请添加图片描述
一句话来总结就是:

在OC中,对可变对象的Copy或者mutableCopy都是深拷贝。对不可变对象使用Cpoy是浅拷贝,使用mutableCopy是深拷贝

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OC中的copy和mutableCopy 的相关文章

  • 以编程方式触发iOS摇动事件

    如何以编程方式触发 iOS 中的摇动事件 我尝试过以下方法 但它总是崩溃 void shake NSLog TEST UIMotionEventProxy m NSClassFromString UIMotionEvent alloc in
  • 错误:更改核心数据模型后架构armv7的重复符号

    我有一个使用核心数据框架的应用程序 我工作得很好 我刚刚更改了数据模型 向一个实体添加一个属性 当我尝试构建它时 出现错误 duplicate symbol OBJC METACLASS AccountFolder in Users XXX
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 防止 AlertView 被解雇

    任何人都可以帮助我防止在其按钮单击事件上解雇警报视图吗 我有一个 textview 作为我的alertView 的子视图 如果 textview 值为 nil 我不想关闭它 因为这是一个非常老的问题 但我得到了一个解决方案 并且如果其他开发
  • NVActivityIndi​​catorView 仅适用于特定视图

    我正在使用这个库https github com ninjaprox NVActivityIndi catorView https github com ninjaprox NVActivityIndicatorView用于显示加载指示器
  • WhatsApp 显示警告“此项目无法共享。请选择其他项目。”对于 iOS 应用程序。

    我正在开发一个 iOS 应用程序 在该应用程序中 我有社交共享功能 并且社交共享功能使用深度链接来共享 URL 该网址共享对于所有应用程序都运行良好 除了WhatsApp 它会显示一个警报弹出窗口 此项目无法共享 请选择其他项目 以下是我的
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • 在故事板中的视图控制器之间滑动手势

    我希望添加左右滑动手势来在视图控制器之间进行更改 这是否可能 并且有没有一种简单的方法可以在故事板中执行此操作 谢谢 故事板允许您在两个视图控制器之间设置 Segues 我想说首先在视图之间附加 Segues 给它一个标识符 然后使用类似的
  • RemoteIO 音频单元播放回调中的 AudioBufferList 内容

    我想 拦截 音频数据传送到 iOS 设备扬声器的过程 我相信这可以使用 RemoteIO 音频单元和回调来完成 在下面的playbackCallback中 ioData实际上包含任何音频数据吗 static OSStatus playbac
  • Xcode 存档上传失败并出现错误

    我正在尝试从 xCode 将新版本上传到 iTunesConnect 但每次我都会遇到此问题 问题是什么 我该如何解决这个问题 最近 我开始在上传过程中遇到问题 Xcode 经常卡住 最终会因您看到的第二个错误而失败 受够了一段时间后 我转
  • 仅将 UIImage 移动到另一个 UIImage 内部

    I have an UIImage which is shown in an UIImageView I also have another image in an UIImageView which lays above the firs
  • 相当于 Interface Builder 中 UIButton 的动态类型“自动调整字体”设置?

    UILabel 有一个Dynamic Type Automatically Adjusts FontInterface Builder 属性检查器中的复选框 Interface Builder 中是否有等效项用于自动调整 UIButton
  • 获取对 iOS 应用程序中最顶层视图/窗口的引用

    我正在创建一个可重用的框架 用于在 iOS 应用程序中显示通知 我希望将通知视图添加到应用程序中其他所有内容的顶部 有点像 UIAlertView 当我初始化监听 NSNotification 事件并添加视图作为响应的管理器时 我需要获取对
  • 如何使用MKMapView完成加载委托,可能的“完成显示”委托?

    当用户在选择注释后点击 保存 时 我尝试保存地图视图的缩略图 当用户尚未放大该注释时会出现问题 因此尚未加载关闭缩放级别 这就是用户点击保存后我正在做的事情 将布尔值 saving 设置为 true 居中并放大注释 无动画 当调用mapVi
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 用 UIView 像翻书一样翻页?

    我正在尝试在之间切换UIViews让它看起来就像你正在翻书的一页 The UIViewAnimationTransitionCurlUp如果我能让它向左或向右卷曲 那就非常接近了 这可能吗 我尝试过使用CATRansition但没有一种动画

随机推荐

  • delphi 发送html邮件,delphi-icv 邮件发送 -所用控件(HtmlSmtpCli).pdf

    kkaayy 的专专栏栏 ddeellpphhii iiccvv 邮邮件件发发送送 所所用用控控件件 HHttmmllSSmmttpp llii 分类 delphi 2013 12 10 16 39 30人阅读 评论 0 收藏 举报 1 界
  • Java多态机制在实际中的应用

    在实际开发工作中 常常遇到一个功能有多种实现方式 比如支付方式 有分微信支付 京东支付 支付宝 银联等支付方式 不同支付方式的大概流程大抵相似 实现细节有所区别 这个时候就可以用到java的多态机制 先定义一个公共接口 接口定义支付流程的各
  • ftp 使用笔记

    https www ngui cc el 2911341 html action onClick 启动 systemctl start vsftpd service 查看启动状态 systemctl status vsftpd servic
  • dart 学习列表 List

    List 列表 在 Dart 编程语言中 List 是一种有序的集合数据类型 用于存储一系列项目 它允许您在单个变量中存储多个项目 并提供了许多操作来管理列表中的数据 以下是关于 Dart 中的 List 的一些重要信息 创建 List 您
  • QDialog类

    QDialog类 QDialog类 api 使用方式 调用exec 槽函数 调用accept槽函数 调用reject槽函数 调用done槽函数 例子 QDialog类 QWedget类中的函数 在QDialog中都可以使用 api 构造函数
  • 进程的状态与task_struct结构体

    一 什么是进程 进程 就是程序的一个执行实例 或正在执行的程序 详细介绍请看 点击打开链接 那么进程在Linux中有几种状态呢 如下 1 R 处于运行或可运行状态 即进程正在运行或在运行队列 可执行队列 中等待 只有在该状态的进程才可能在C
  • 程序员工作之后如何提升自己?

    IT行业人士里有不少人似乎从来就没晋升过 年复一年 他们工作在同一岗位上 停留在同一职位上 我不知道他们是否得到过晋升机会 你认识这样的人吗 这事居然出人意料地常见 如果你不想终老在这条死胡同上 就得做点什么 在本章中 我将给你一些如何攀登
  • git - 简明指南

    git 简明指南 助你入门 git 的简明指南 木有高深内容 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹 打开 然后执行 git init 以创建新的 git 仓
  • windows开机运行jar

    windows开机自启动jar包 一 保存bat批处理文件 echo off 1 mshta vbscript CreateObject WScript Shell Run s0 0 FALSE window close exit java
  • 邮局选址问题

    邮局选址问题 题目描述 一条直线上有居民点 邮局只能建在居民点上 给定一个有序整形数组arr 每个值表示居民点的一维坐标 再给定一个正数num 表示邮局数量 选择num个居民点建立num个邮局 使所有的居民点到邮局的总距离最短 返回最短的总
  • 中国被黑站点统计系统 2006年9月分析报告

    源 中国被黑站点统计系统 http www zone h com cn amxku amxku at msn com 自在轮回 zizailunhui at msn com wayking wayking at hotmail com 目录
  • Matlab机器人工具箱画图卡顿解决方法

    机器人工具箱画图卡顿问题的解决 一般情况下 使用机器人工具箱画图就只是使用下面的命令 robot plot q 其中q为角度 但是这样画出的图非常卡顿 问题分析 默认画图指令画图效果如下 可以很清楚的看到 下面都是的方格已经多到模糊了 修改
  • FSDataOutputStream (浅析hadoop写入数据api)

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 Hadoop对于写操作提供了一个类 FSDataOutp
  • 【JS&Html】一些总结

    html里面 监听回车事件 监听回车 若回车按下 执行相应操作 document onkeypress kDown if document layers window captureEvents Event KEYDOWN function
  • 提示工程师:如何高效的向ChatGPT提问对话

    最近ChatGPT真的火出圈了 现在打开知乎 博客 抖音 B站都是这方面的信息 ChatGPT相关的信息铺天盖地的袭转而来 对于这种类似新一轮信息技术革命 作为普通人的我们 该如何做呢 这是我们该思考的 英伟达创始人兼CEO黄仁勋 this
  • 闪回数据库案例

    闪回数据库案例 测试数据 create table sct4 id number 4 name varchar2 20 insert into sct4 values 1 lili insert into sct4 values 2 lil
  • 小孩报数问题

    import java util LinkedList import java util List import java util Scanner public class Main public static void main Str
  • Java笔记-多线程之线程池

    介绍 在前面的文章中 我们使用线程的时候就去创建一个线程 这样实现起来非常简便 但是就会有一个问题 程序启动一个新线程成本是比较高的 因为它涉及到要与操作系统进行交互 而使用线程池可以很好的提高性能 尤其是当程序中要创建大量生存期很短的线程
  • 最萌算法学习,一秒让程序员及其女友都能学会!

    普通程序员 不学算法 也可以成为大神吗 对不起 这个 绝对不可以 可是算法好难啊 看两页书就想睡觉 所以就不学了吗 就一直当普通程序员吗 如果有一本算法书 看着很轻松 又有代码示例 又有讲解 怎么会有那样的书呢 哎呀 最好学了算法人还能变得
  • OC中的copy和mutableCopy

    在OC中 对对象的拷贝可分为深拷贝和浅拷贝 深拷贝 会生成新的指针和新的内存 新的指针指向新开辟的内存空间 并且会将原来的内存中的内容也拷贝过来 浅拷贝 会生成新的指针 但是不会开辟新的内存空间 也不会拷贝原来内存中的内容 新生成的指针会指