iOS对于copy的原理以及常见的使用场景

转载 2015年11月17日 20:20:56

     在iOS开发中,对象之间传值都是使用引用计数器增加的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址,当一个指针执行的对象属性值发生改变时,不影响另一个对象,那么需要分配两个不同的内存地址,也就是说,我们就不可以采用retain关键字了,而是要采用copy 关键字。如:

property (nonatomic,copy)nesting * name;

 一:
       区分深复制与浅复制,一般只有可变的mutableCopy到mutableCopy的Copy才是浅复制,不产生副本只是retain count增加。
副本的特点:彼此的内容一样,拥有相同的方法,在内存中有两个对象.
1.copy
1> 如果对象有 可变/不可变 版本的区别, copy方法只能拷贝出不可变的副本.
2> 如果对象没有 可变/不可变 版本的区别,copy方法只是建立一个副本.

2.mutableCopy
建立对象的可变版本的副本(如果对象有 可变/不可变 版本之分)

3.深拷贝/浅拷贝
1>深拷贝:如果建立出新的副本,在内存中有两个对象.就是深拷贝.
可变 -> 不可变 (copy)  
可变 -> 可变 (mutableCopy)
不可变 -> 可变 (mutableCopy)

2.浅拷贝:不会建立新的副本, 只是引用计数加1.
不可变 -> 不可变  (因为两个不可变对象谁都不会被改变,也就没必要建立副本)

二:

COPY的使用场景:

二.@property中的copy参数
copy参数的作用:
在属性的 setter 实现中对赋值对象做一次copy操作,将copy操作的结果赋值给属性.

具体情况如下:

1.情况一: 属性是不可变类型的. 如 NSString
如果赋值对象是可变的,那么会将一个不可变副本赋值给属性.
如果赋值对象是不可变的,那么不会产生新的副本,只是对复制对象引用计数加1.

2.情况二. 属性是可变类型的, 建议不要是用 copy 参数
因为可变类型的属性,我们是会根据需求对其内容进行修改的,如果用copy那么,该属性保存的真是对象类型就是不可变的,这样如果去修改这个属性,编译时不会报错,但是运行会奔溃,因为尝试去修改一个不可变类型的对象.

3.情况三. 自定义对象类型, 一般情况下我们不会对自定义的对象使用 copy 参数.
必须遵守<NSCopying>协议 ,实现 copyWithZone: 方法. 才能够调用 copy 方法.建立副本



iOS中copy和mutableCopy的详细分析

copy和mutableCopy在实际开发中常用到,同时,copy属性修饰符也是我们在定义NSString、NSArray和block等需要用到的,要较好地掌握它们,需要从原理上去分析于理解,本文侧重...
  • nineteen_
  • nineteen_
  • 2015年09月17日 21:24
  • 1887

iOS开发怎么使用copy关键字

使用场景; (1)、NSString、NSArray、NSDictionary等经常使用copy关键字         原因:NSString、NSArray、NSDictionary等有其相对应的可...
  • ciwei_numberOne
  • ciwei_numberOne
  • 2016年01月07日 14:27
  • 1098

iOS开发:runtime原理简单分析和基本使用场景

一:rumtime原理简单分析 runtime是运行时库(Runtime Library),也简称运行时。 它是一个主要是C和汇编写的库,对C进行了特殊的处理,将结构体视为对象,将函数视为方法,使得C...
  • indulgeIn
  • indulgeIn
  • 2016年04月10日 12:25
  • 4057

iOS开发笔记之六十一——Autorelease Pool的实现原理总结

一、背景 要想深入了解autorelease pool的原理,看以下两片文章即可: Using Autorelease Pool Blocks Objective-C Autorelease Poo...
  • lizitao
  • lizitao
  • 2017年02月22日 15:24
  • 1432

iOS --- 理解UIWindow及其常见使用场景

UIWindow继承自UIView, 用来管理和协调各种视图. 提供一个区域来显示视图, 将事件event分发给视图. 每个iOS应用必须包含一个window用于展示APP的交互页面. 且一个APP...
  • icetime17
  • icetime17
  • 2016年04月04日 20:48
  • 1002

iOS开发:runtime原理简单分析和基本使用场景

一:rumtime原理简单分析 runtime是运行时库(Runtime Library),也简称运行时。 它是一个主要是C和汇编写的库,对C进行了特殊的处理,将结构体视为对象,将函数视为...
  • xinkongqiSHF
  • xinkongqiSHF
  • 2016年12月09日 18:07
  • 126

readwrite、readonly、retain、copy、assign、nonatomic的作用以及使用场景

1 . 可读性: readonly、readwrite @property(readwrite,....) valueType value; 这个属性是变量的默认属性,就是如果你 (rea...
  • ZZ825194632
  • ZZ825194632
  • 2016年01月10日 22:49
  • 205

Newstartha常见使用场景

  • 2013年06月06日 10:53
  • 94KB
  • 下载

block使用copy原理

简单来说,block就像一个函数指针,指向我们要使用的函数。 就和函数调用一样的,不管你在哪里写了这个block,只要你把它放在了内存中(通过调用存在这个block的方法或者是函数),不管放在栈...
  • leonliu070602
  • leonliu070602
  • 2016年10月31日 14:01
  • 285

iOS Copy 关键字 的使用 原创 + 转载

分享链接 http://www.jianshu.com/p/4e327d1832ef        分享链接2 iOS 深拷贝   和 浅拷贝       https://github.c...
  • jerry129GT
  • jerry129GT
  • 2016年02月28日 13:54
  • 218
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS对于copy的原理以及常见的使用场景
举报原因:
原因补充:

(最多只允许输入30个字)