OC copy mutableCopy, 浅拷贝,深拷贝
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, 浅拷贝,深拷贝的更多相关文章
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- OC Copy and MutableCopy的使用
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> // copy代表set ...
- iOS copy&mutableCopy理解
Copy&mutableCopy 通过copy方法可以创建可变或不可变对象的不可变副本,通过mutableCopy可以创建可变或不可变对象的可变副本. 拷贝分为浅拷贝和深拷贝: 浅拷贝:指 ...
- Python中的浅拷贝 深拷贝
浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...
- Python__学习路上的坑之--引用,浅拷贝,深拷贝
copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...
- Python深入:02浅拷贝深拷贝
对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- $.extend()浅拷贝深拷贝
参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.ex ...
- OC Copy基本使用(深拷贝和浅拷贝)
首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...
随机推荐
- 找出N个无序数中第K大的数
使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求 时间复杂度: 1.若随机选取枢纽,线性期望时间O(N) 2.若 ...
- LeetCode 搜索二维矩阵 II
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- HDOJ 2007 平方和与立方和
#include<iostream> #include<algorithm> using namespace std; int main() { int m, n; while ...
- imageLoader之介绍
相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...
- [UE4]爆头和穿墙
一.LineTracebyChannel的Out Hit值展开后有一个名为“Hit Bone Name”(击中的骨骼名称),以此来判断击中的是否是头部,进而实现爆头的目的(爆头:高伤害,一枪毙命) 二 ...
- vue 父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法
Header.vue <template> <div> <h2>我是头部组件</h2> <button @click="getParen ...
- 本地IP,掩码,网关,DNS设置
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C# 自己动手实现Spy++(二)
昨天已经实现了获取窗口的标题.句柄等信息,但是高亮部分还有问题,而且红色绘制框擦除也有问题,今天就又研究了下上述两个问题. 高亮部分红色框只显示左上的边框,而右下的显示不出来,如图: 代码如下: pu ...
- 通过Xshell来访问和连接Linux
Xshell初使用:Xshell资源下载 刚刚接触Xshell是在javamail中的telnet收发邮件,然而这个我们并不常用,用的最多的是Xshell进行访问和连接远程主机. 通过Xshell来访 ...
- courator - create
0. retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3); 1. client 1) recipes ...