copy 减少对象上下文依赖

copy 创建一个新对象,copy得到的副本对象与原来内容相同,新的对象retain为1,与旧有对象的引用计数无关,旧有对象没有变化

使用 copy 创建出来的对象是不可变的, 使用mutableCopy创建出来是可以改变的

如果对不可变对象复制,copy是指复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的;

对于属性@Property的copy 修饰符

属性的copy特性会在属性调用Setter时发送copy消息;

属性并没有mutableCopy特性;

字符串属性一般设置为copy,目的是减少对于可变字符串对象的依赖。

字符串类型一般使用copy

自定义的类要添加这个协议 并实现copyWithZone这个方法

ie:

-(id)copyWithZone:(NSZone *)zone{

XYPoint *point=[[XYPoint allocWithZone:zone]initWithX:self.x andY:self.y];

return point;

}

对象复制

ie:

NSMutableArray *arr=[NSMutableArray array];

NSString *str1=@"one";

NSString *str2=@"two";

NSString *str3=@"three";

[arr addObject:str1];

[arr addObject:str2];

[arr addObject:str3];

NSArry *copyArr=[arr copy];

arr与copyArr地址不同

ie 改为NSMutablesString

NSMutableArray *arr=[NSMutableArray array];

NSString *str1=[[NSMutableArray array];

NSString *str2=@"two";

NSString *str3=@"three";

[arr addObject:str1];

[arr addObject:str2];

[arr addObject:str3];

NSArry *copyArr=[arr copy];

arr与copyArr地址不同

NSMutableArray *arr=[NSMutableArray array];

NSMutableString *str1=[[NSMutableString alloc] initWithString:@"one"];

NSMutableString *str2=[[NSMutableString alloc] initWithString:@"tow"];

NSMutableString *str3=[[NSMutableString alloc]initWithString:@"three"];

[arr addObject:str1];

[arr addObject:str2];

[arr addObject:str3];

NSArray *copyArr=[arr copy];

NSLog(@"arr address = %p",arr);

NSLog(@"copyArr address = %p",copyArr);

NSMutableString *firstStr=[arr objectAtIndex:0];

[firstStr appendString:@"1"];

NSLog(@"%@",arr);

NSLog(@"%@",copyArr);

打印出来两个数组的内容都同时改变了

浅拷贝

arr1 对象 arr2

0->    A     <-0
1-> B <-1
2-> C <-2
3-> D <-3
4-> E <-4 NSMutableArray *arr=[NSMutableArray array];
NSMutableString *str1=[[NSMutableString alloc] initWithString:@"one"];
NSMutableString *str2=[[NSMutableString alloc] initWithString:@"tow"];
NSMutableString *str3=[[NSMutableString alloc]initWithString:@"three"];
[arr addObject:str1];
[arr addObject:str2];
[arr addObject:str3];
NSArray *copyarr=[[NSArray alloc]initWithArray:arr copyItems:YES];
NSMutableString *firstStr=[arr objectAtIndex:0];
[firstStr appendString:@"1"];
深拷贝
arr1 对象 arr2 对象
0-> A 0-> A
1-> B 1-> B
2-> C 2-> C
id:
NSMutableArray *arr=[NSMutableArray array];
XYpoint *p1=[[XYPoint alloc]initWithX:1 andY:2];
XYpoint *p2=[[XYPoint alloc]initWithX:1 andY:3];
XYpoint *p3=[[XYPoint alloc]initWithX:1 andY:4];
NSArray *copyArr = [[NSArray alloc]initWithArray:arr copyItems:YES];
XYPoint *point = [arr objectAtIndex:0];
point.x=7;

Object-C-复制的更多相关文章

  1. ngx-bootstrap使用03 Alerts组件、利用Object.assign复制对象

    1 Alerts 该组件用于给用户操作提供反馈信息或者提供一些警告信息 2 用法 2.1 下载ngx-bootstrap依赖 参考博文:点击前往 2.2 在模块级别导入AlertModule模块 技巧 ...

  2. Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象

    作用 Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象. 语法 Object.assign(target, ...sources) 参数 ta ...

  3. JavaScript Object的复制

    var obj = { a: 1, b: 2, c: { d: 3, e: 4, f: function () { console.log("对象复制"); } } } 1. fo ...

  4. java 使用BeanUtils.copyProperties(Object source,Object target) 复制字段值

    BeanUtils.copyProperties(person, wsPerson);把person的字段值,复制给wsPerson // 只复制两个实体中,字段名称一样的 很有用的一个功能...

  5. Object.assign(o1, o2, o3) 对象 复制 合拼

    Object 对象方法学习之(1)—— 使用 Object.assign 复制对象.合并对象 合并对象 var o1 = {a: 1}; var o2 = {b: 2}; var o3 = {c: 3 ...

  6. C#中深复制和浅复制

    C# 支持两种类型:“值类型”和“引用类型”. 值类型(Value Type)(如 char.int 和 float).枚举类型和结构类型. 引用类型(Reference Type) 包括类 (Cla ...

  7. js中关于new Object时传参的一些细节分析

    1, 参数是一个对象,核心js对象(native ECMAScript object)或宿主对象(host object),那么将直接返回该对象. 其生成的对象构造器仍然是所传参数对象的构造器.这样造 ...

  8. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  9. 后进先出 stack、 先进先出Queue

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  10. console对象-转

    console对象 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 开发者工具 console对象 console.log() console.debug() ...

随机推荐

  1. 将Linux系统的字体全改成中文

    # 修改字符集,否则可能报 input/output error的问题,因为日志里打印了中文 $ localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 $ export ...

  2. VC++ 学习笔记3 获取编辑框字符串

    边界框添加字符串比较简单 可以直接在对话框的空间上面点击右键添加变量,变量类型为CString  在此取名为m_NUM 直接使用m_NUM就是编辑框的CString, 举例: 在messagebox显 ...

  3. 【POJ2154】Color Pólya定理+欧拉函数

    [POJ2154]Color 题意:求用$n$种颜色染$n$个珠子的项链的方案数.在旋转后相同的方案算作一种.答案对$P$取模. 询问次数$\le 3500$,$n\le 10^9,P\le 3000 ...

  4. MVC + ajaxform 文件上传

    一.前端cshtml代码 <tr> <td width="130" align="right">添加附件:</td> @us ...

  5. Java虚拟机八 分析Java堆

    常见的内存溢出的原因及其解决思路 1.堆溢出: 由于大量的对象都直接分配在堆上,因此它最有可能发生溢出.因为大量对象占据了堆空间,而这些对象都持有强引用,导致无法回收,当对象大小之和大于堆空间时就会发 ...

  6. nodejs事件的监听与事件的触发

    nodejs事件(Events) 一.事件机制的实现 Node.js中大部分的模块,都继承自Event模块(http://nodejs.org/docs/latest/api/events.html  ...

  7. python-django开发学习笔记二

    1.简述 1.1 开发环境 该笔记所基于的开发环境为:windows8.python2.7.5.psycopg2-2.4.2.django1.5.4.pyCharm-2.7.3.以上所描述的软件.插件 ...

  8. 完美解决onchange不能实时的监听

    我们大家都知道onchange有时候很不好用,因为onchange事件是离开焦点后才会被触发,而不是实时去监听! 那么oninput()事件和onpropertychange()完美的解决了问题:(o ...

  9. 邮件的DNS设置

    为了反垃圾,在发件人使用的域名下面最好配置两条DNS记录:SPF和DKIM,他们都是用来反垃圾的,邮件接受服务器会检查这两项,只有符合要求才会进入用户的邮箱. 一般来说,大批量发送邮件时,我们会使用第 ...

  10. 解决SQL Server管理器无法连接远程数据库的问题(转)

    add by zhj: 本文最后那个数据库别名没搞明白,在我的测试中没有建别名,是可以的.远程登陆时,服务器名称: 服务器IP,端口号 (如223.42.155.248,52134 如果是默认端口号1 ...