copy和mutableCopy详解

非容器对象:


NSString


NSMutableString


不可变对象复制:

copy是指针复制(浅拷贝);

mutableCopy就是对象复制(深拷贝)。

可变对象复制:

都是深拷贝,但是copy返回的对象是不可变的。


copy


浅copy,不会产生新的地址,两个指针指向同一地址


深copy,会产生新的地址,两个指针指向不同地址,并且copy 出来的对象是不可变的。


mutableCopy


深copy,会产生新的地址,两个指针指向不同地址


深copy,会产生新的地址,两个指针指向不同地址

系统容器对象:


NSArray


NSMutableArray


不可变对象复制:

copy是指针复制(浅拷贝);

mutableCopy就是对象复制(深拷贝)。

可变对象复制:

都是深拷贝,但是copy返回的对象是不可变的。

对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。


copy


浅copy,不会产生新的地址,两个指针指向同一地址


深copy,会产生新的地址,两个指针指向不同地址,并且copy 出来的对象是不可变的。


mutableCopy


深copy,会产生新的地址,两个指针指向不同地址


深copy,会产生新的地址,两个指针指向不同地址

总结:


immutableObject


mutableObject


copy


浅copy


深copy


mutableCopy


深copy


深copy


集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制

NSMutableArray *mArray=[NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c", nil];

NSArray *array1=[mArray copy];
NSMutableArray *mArray1=[mArray copy];
//[mArray1 addObject:@"sss"]; 这一步会出错,因为mutableObject copy返回的对象是不可变的。

NSArray *array2=[mArray mutableCopy];
NSMutableArray *mArray2=[mArray mutableCopy];

NSMutableString *testString = [mArray2 objectAtIndex:0];
[testString appendString:@"new"];//这样以上三个数组的首元素都被改变了

时间: 2024-12-17 10:44:18

copy和mutableCopy详解的相关文章

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

copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化.copy减少对象对上下文的依赖 retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝. 当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying

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

这里主要侧重于集合类的深浅拷贝,主要事因为工作的时候遇到这个问题.有不足的地方欢迎指正,转载请注明. 首先我们需要有这样的一个前提: [array addObject:obj];这样obj的引用计数会增加1,如果使用remove则obj的引用计数会减一.ios对集合的内存处理就是这样的.那么,假设obj只被array拥有:id temp = [array objectAtIndex:0];[array removeObjectAtIndex:0];如果你再要使用temp就会出错,因为这个时候ob

ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 但是在iOS 5中加入ARC,产生了几个新的关键字strong, weak, unsafe_unretained.  我们可以将其与以前的关键字对应学习: strong与retain类似,weak和unsafe_unretained这两个新关键字与assign类

ansible 模块之 copy模块详解

ansible copy 模块详解 ansible copy 模块主要用于文件或目录复制.详细如下: src ansible 端源文件或目录,空文件夹不复制 content 用来替代src 用于将指定的文件内容复制到远程文件 dest 客户端目标目录或文件,需要绝对路径 back_up 复制之前备份远程节点上的原始文件 directory_code 用于复制文件夹,新建文件会被复制,旧文件不会被复制 follow 支持link文件复制 force 覆盖远程主机不一致的内容 group 设定远程主

Objective-C中的浅拷贝和深拷贝详解

  浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.如: 1 2 char* str = (char*)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针. iOS 里面的浅拷贝: 在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝.他既让几个指针共用同一片内存空间,又可以在release

iOS开发——多线程OC篇&多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

ios开发之 NSObject详解

NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力.下面我们就详细的介绍NSObject. 一.使用详解 1.加载及初始化类 /** 运行时加载类或分类调用该方法, 每个类只会调用一次 */ + (void)load { } /** 类实例化使用前需要先初始化, 一个类调用一次, 如果子类没有实现该方法则会调用父类方法

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A