Object-C-复制
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-复制的更多相关文章
- ngx-bootstrap使用03 Alerts组件、利用Object.assign复制对象
1 Alerts 该组件用于给用户操作提供反馈信息或者提供一些警告信息 2 用法 2.1 下载ngx-bootstrap依赖 参考博文:点击前往 2.2 在模块级别导入AlertModule模块 技巧 ...
- Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象
作用 Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象. 语法 Object.assign(target, ...sources) 参数 ta ...
- JavaScript Object的复制
var obj = { a: 1, b: 2, c: { d: 3, e: 4, f: function () { console.log("对象复制"); } } } 1. fo ...
- java 使用BeanUtils.copyProperties(Object source,Object target) 复制字段值
BeanUtils.copyProperties(person, wsPerson);把person的字段值,复制给wsPerson // 只复制两个实体中,字段名称一样的 很有用的一个功能...
- Object.assign(o1, o2, o3) 对象 复制 合拼
Object 对象方法学习之(1)—— 使用 Object.assign 复制对象.合并对象 合并对象 var o1 = {a: 1}; var o2 = {b: 2}; var o3 = {c: 3 ...
- C#中深复制和浅复制
C# 支持两种类型:“值类型”和“引用类型”. 值类型(Value Type)(如 char.int 和 float).枚举类型和结构类型. 引用类型(Reference Type) 包括类 (Cla ...
- js中关于new Object时传参的一些细节分析
1, 参数是一个对象,核心js对象(native ECMAScript object)或宿主对象(host object),那么将直接返回该对象. 其生成的对象构造器仍然是所传参数对象的构造器.这样造 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 后进先出 stack、 先进先出Queue
using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...
- console对象-转
console对象 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 开发者工具 console对象 console.log() console.debug() ...
随机推荐
- dirname的用法:获取文件的父级目录路径
命令:dirname 获取文件的路径(到父级目录)用法:dirname file_name [root@bogon opt]# a=$(dirname /mnt/a/b/c/d/a.sh) [root ...
- 【转】Windows socket基础
转自:http://blog.csdn.net/ithzhang/article/details/8448655 Windows socket 基础 Windows socket是一套在Windows ...
- 网站测速、ping
1.17ce 2. 360奇云测 3.http://ping.chinaz.com/ 效果图:
- 【CF802C】Heidi and Library (hard) 费用流
[CF802C]Heidi and Library (hard) 题意:有n个人依次来借书,第i人来的时候要求书店里必须有种类为ai的书,种类为i的书要花费ci块钱购入.而书店的容量只有k,多余的书只 ...
- iOS - 国际化语言切换
iOS国际化:如何切换语言 1.国际化就是将标签.提示信息等信息放到资源文件中,随着程序需要的语言提供对应的资源文件.以key/value对存储,每个资源的key值不变,value随着需求改变. ...
- mysql rowid实现
) a, b b表是数据表
- Vim 使用入门快捷键
Vim 和 Emac 都是利器啊,前段时间决定熟悉一套跨平台的编辑器,以便在 Win,Mac,Ubuntu 下都有相同的编辑体验. 于是尝试了一下 Vim,使用了一段时间,确实比 UE 之类的要高效. ...
- Kafka在Linux上安装部署及样例测试
Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了 ...
- centos 安装laravel
1.下载composer并全局安装 curl -sS https://getcomposer.org/installer | php 2.查看全局命令目录 echo $PATH 移动composer到 ...
- OC中分类(Category)和扩展(Extension)
1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...