copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的。

OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对象还是只有一个。

例:

NSMutableString *str = [NSMutableString stringWithString:@"abc"];

NSString *str2 = str;

str与str2指向的是同一个对象,str变了str2随之改变。

NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];

NSArray *array2 = array;

array1与array2指向的是同一个对象,array对象的内存地址相同,array1变了array2随之改变。这里有一个注意点,array2中存的仍是obA,obB,obC,只不过会把他们的引用计数加一。

深拷贝:

NSMutableString *str = [NSMutableString stringWithString:@"abc"];

NSString *str2 = [str copy];

str与str2指向的是不同的对象,str变了str2不会变。

NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];

NSArray *array2 = [array copy];

array1与array2指向的是不同的对象,array对象的内存地址不同(注意,内部obA,obB,obC的内存地址相同),array1变了array2不会变,这里的变指的是array中的元素增加或减少,假设array1少了一个obC,array2中仍是obA,obB,obC。同样有一个注意点,array2中存的仍是对象的指针obA, obB, obC, 只不过他们的引用计数会加一,这时如果obA的某个属性变了,那么array2中obA的某个属性也会跟着变,原因很简单,因为这两个obA就是同一个对象。所以这里的深拷贝只是指针级的深拷贝。

所以如果想做到内容级的深拷贝,一种方法是手动对array中每一个对象执行copy操作,然后加到新数组中,前提是array中的对象都支持copy协议。

例:

NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];

NSMutableArray *array2 = [[NSMutableArray alloc] init];

for(id ob in array1) {

id obCopy = [ob copy];

[array2 addObject:obCopy];

}

这种情况下不论是array对象还是array中的内容被拷贝完都是两份,所以array1中无论是数组内容增加减少,或者其中的对象obA的某个属性改变,对array2中的元素都没有影响。不过实际代码中这种情况比较少,自己的项目经历中貌似只有一个冬奥会轮播图的控件中用到过。

mutaleCopy 与copy的区别也很简单,mutable么就是可变的,所以mutableCopy拷贝出来的都是可变的对象(通常为NSMutableString, NSMutableArray, NSMutableDictionary),copy拷贝出来的是不可变的对象。

OC copy mutableCopy, 浅拷贝,深拷贝的更多相关文章

  1. copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)

    写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...

  2. OC Copy and MutableCopy的使用

    #import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> // copy代表set ...

  3. iOS copy&mutableCopy理解

    Copy&mutableCopy   通过copy方法可以创建可变或不可变对象的不可变副本,通过mutableCopy可以创建可变或不可变对象的可变副本. 拷贝分为浅拷贝和深拷贝: 浅拷贝:指 ...

  4. Python中的浅拷贝 深拷贝

    浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...

  5. Python__学习路上的坑之--引用,浅拷贝,深拷贝

    copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...

  6. Python深入:02浅拷贝深拷贝

    对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...

  7. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  8. $.extend()浅拷贝深拷贝

    参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.ex ...

  9. OC Copy基本使用(深拷贝和浅拷贝)

     首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...

随机推荐

  1. 找出N个无序数中第K大的数

    使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求 时间复杂度: 1.若随机选取枢纽,线性期望时间O(N) 2.若 ...

  2. LeetCode 搜索二维矩阵 II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  3. HDOJ 2007 平方和与立方和

    #include<iostream> #include<algorithm> using namespace std; int main() { int m, n; while ...

  4. imageLoader之介绍

    相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...

  5. [UE4]爆头和穿墙

    一.LineTracebyChannel的Out Hit值展开后有一个名为“Hit Bone Name”(击中的骨骼名称),以此来判断击中的是否是头部,进而实现爆头的目的(爆头:高伤害,一枪毙命) 二 ...

  6. vue 父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法

    Header.vue <template> <div> <h2>我是头部组件</h2> <button @click="getParen ...

  7. 本地IP,掩码,网关,DNS设置

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. C# 自己动手实现Spy++(二)

    昨天已经实现了获取窗口的标题.句柄等信息,但是高亮部分还有问题,而且红色绘制框擦除也有问题,今天就又研究了下上述两个问题. 高亮部分红色框只显示左上的边框,而右下的显示不出来,如图: 代码如下: pu ...

  9. 通过Xshell来访问和连接Linux

    Xshell初使用:Xshell资源下载 刚刚接触Xshell是在javamail中的telnet收发邮件,然而这个我们并不常用,用的最多的是Xshell进行访问和连接远程主机. 通过Xshell来访 ...

  10. courator - create

    0. retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3); 1. client 1) recipes ...