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.修改源文件的内容,不会影响副本文件: ...
随机推荐
- jQuery 事件的命名空间简单了解
原文地址:http://www.jb51.net/article/43626.htm 用 jQuery 绑定和解绑事件监听器都是非常简单的,怎样精确地解绑其中一个监听器?我们需要了解一下事件的命名 ...
- vSphere 查看FC HBA的WWNN和WWPN
# 查看WWN号
- Ubuntu14.04 下软件安装和卸载命令备记
一.Ubuntu中软件安装方法 1.APT方式 ()普通安装:apt-get install softname1 softname2 …; ()修复安装:apt-get -f install soft ...
- base_基础
目录 A B C D E F G H I J K L M N S: Sqlite: 1;orhanobut/hawk; A: Adapter: 图片处理 Android中自定义布局中加载图片Bitma ...
- (转)C# Oracle数据库操作类
原文地址:http://www.cnblogs.com/haibing0107/p/6143922.html using System;using System.Data;using System.C ...
- Linux最大线程数限制及当前线程数查询
常用配置 echo > /proc/sys/kernel/pid_max a) 当前环境生效 ulimit -d unlimited ulimit -m unlimited ulimit -s ...
- SpringBoot在Kotlin中的实现(二)
根据现在的开发模式和网上的一些资料,SpringBoot需要对业务和操作进行分层,通常分为controller.entity.service.respository等结构.下面以Kotlin官网的例子 ...
- python学习之----lxml库和HTML parser
lxml 这个库(http://lxml.de/)可以用来解析HTML 和XML 文档,以非常底层的实现而闻名 于世,大部分源代码是用C 语言写的.虽然学习它需要花一些时间(其实学习曲线越 陡峭,表明 ...
- live2d添加网页看板娘
最近逛博客,发现好多博主都加了网页看板娘,简直可爱到血槽空了,赶紧学习模仿改造了一下~ 给博客园的博客也添加了看板娘!!就在右边~喜欢的请打赏我~ 不过因为移植过来比较复杂,就不出教程啦~记得多来调教 ...
- vue项目安装sass/scss
vue 添加scss 安装好之后使用: 注意scss和sass的语法区别,scss是用传统花括号,sass是缩进控制,看个人习惯选择语言 sass语法看这里==>sass基本语法 vue项目编译 ...