Copy基本使用(深浅拷贝)

把握:copy 和mutaleCopy 的区别

1:使用copy功能的前提是什么?

  • 使用copy功能的前提: 需要遵守NSCopying协议,实现copyWithZone:方法
  • 使用mutableCopy功能的前提: 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法

2:如何使用copy功能(重点理解)

一个对象可以调用copy或mutableCopy方法来创建一个副本对象

  • copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)
  • mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)

3:copy基本原则(重点理解)

  • 修改源对象的属性和行为,不会影响副本对象
  • 修改副本对象的属性和行为,不会影响源对象

4:为什么通过不可变对象调用了copy方法, 不会生成一个新的对象?

  • 因为原来的对象是不能修改的, 拷贝出来的对象也是不能修改的
  • 既然两个都不能修改, 所以永远不能影响到另外一个对象, 那么已经符合需求
  • 所以: OC为了对内存进行优化, 就不会生成一个新的对象

copy内存管理

1:浅拷贝和深拷贝的区别?本质是什么?

1.浅复制(浅拷贝,指针拷贝,shallow copy)

  • 源对象和副本对象是同一个对象
  • 源对象(副本对象)引用计数器+1,相当于做一次retain操作
  • 本质是:没有产生新的对象

2.深复制(深拷贝,内容拷贝,deep copy)

  • 源对象和副本对象是不同的两个对象
  • 源对象引用计数器不变,副本对象计数器为1(因为是新产生的)
  • 本质是:产生了新的对象

copy和property

1:@property中的copy的作用是什么?

  1. 防止外界修改内部的数据
  2. 可以使用copy保存block, 这样可以保住block中使用的外界对象的命
  3. block默认存储在栈中, 栈中的block访问到了外界的对象, 不会对对象进行retain

2:@property内存管理原则?

MRC

  1. copy : 只用于NSString\block
  2. retain : 除NSString\block以外的OC对象
  3. assign :基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign

ARC

  1. copy : 只用于NSString\block
  2. strong : 除NSString\block以外的OC对象
  3. weak : 当2个对象相互引用,一端用strong,一端用weak
  4. assgin : 基本数据类型、枚举、结构体(非OC对象)

3:如何解决block中的循环引用?

如果对象中的block又用到了对象自己, 那么为了避免内存泄露, 应该将对象修饰为__block

__block Person *p = [[Person alloc] init]; // 1
p.name = @"lnj";
NSLog(@"retainCount = %lu", [p retainCount]);p.pBlock = ^{NSLog(@"name = %@", p.name); // 2
};
NSLog(@"retainCount = %lu", [p retainCount]);
p.pBlock();

20.自定义类实现Copy

1:自定义类如何实现copy操作?

  1. 以后想让自定义的对象能够被copy只需要遵守NSCopying协议
  2. 实现协议中的- (id)copyWithZone:(NSZone *)zone
  3. 在- (id)copyWithZone:(NSZone *)zone方法中创建一个副本对象, 然后将当前对象的值赋值给副本对象即可
- (id)copyWithZone:(NSZone *)zone
{// 1.创建一个新的对象Person *p = [[[self class] allocWithZone:zone] init];// 2.设置当前对象的内容给新的对象p.age = _age;p.name = _name;// 3.返回新的对象return p;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{// 1.创建一个新的对象Person *p = [[[self class] allocWithZone:zone] init];// 2.设置当前对象的内容给新的对象p.age = _age;p.name = _name;// 3.返回新的对象return p;
}

转载于:https://www.cnblogs.com/dreamWanweidong/p/4998808.html

copy 和mutaleCopy相关推荐

  1. Docker 入门系列(7)- Dockerfile 使用(FROM、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、WORKDIR)

    Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 来快速创建自定义的镜像. 1. 基本结构 Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行. ...

  2. torch中的copy()和clone()

    torch中的copy()和clone() 1.torch中的copy()和clone() y = torch.Tensor(2,2):copy(x) --- 1 修改y并不改变原来的x y = x: ...

  3. Go 学习笔记(11)— 切片定义、切片初始化、数组和切片差异、字符串和切片转换、len()、cap()、空 nil 切片、append()、copy() 函数、删除切片元素

    1. 切片定义 Go 语言切片是对数组的抽象. Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容 ...

  4. copy 修改时间_DAY5-step3 Python用shutil.copy(), shutil.copystat()复制文件

    Python复制文件的方法 Python提供了内置函数,可使用操作系统Shell工具轻松复制文件. 以下命令用于复制文件 shutil.copy(src,dst) 以下命令用于复制带有元数据信息的文件 ...

  5. Copy复制命令兼容各种浏览器(等同于触发Ctrl+C或者Command⌘+C)

    /*复制命令兼容各种浏览器*/ function copy(copyContent, isAlert, maxLength) {if (window.clipboardData) {window.cl ...

  6. NSString属性什么时候用copy,什么时候用strong?

    我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看 ...

  7. SVN提交错误:working copy is not up-to-date解决方法

    我在项目中删了2个jar,然后SVN提交,一直提交不成功 svn在提交时报错如下图: working copy is not up-to-date svn:commit failed(details ...

  8. OC指示符assign、atomic、nonatomic、copy、retain、strong、week的解释

    在使用@property定义property时可以在@property与类型之间用括号添加一些额外的指示符,常用的指示符有assign.atomic.nonatomic.copy.retain.str ...

  9. Python_赋值和深浅copy

    Python中赋值和深浅copy存储变化 在刚学python的过程中,新手会对python中赋值.深浅copy的结果感到丈二和尚.经过多次在网上查找这几个过程的解释说明以及实现操作观察,初步对这几个过 ...

最新文章

  1. Java Stack栈类详解
  2. jvm_虚拟机参数讲解(二)
  3. Hibernate中对增删改查的小结
  4. 在Excel中实现下拉列表选择录入
  5. cdrom是多媒体微型计算机,全国计算机二级题库第三章
  6. 学习《Core IO学习心得》
  7. Sublime Text 收藏笔记
  8. linux mysql远程连接
  9. SQLyog官网下载,SQLyog-12.4.2下载,SQLyog最新版下载,SQLyog Download
  10. css系统自带字体_CSS系统字体
  11. GoF 设计模式:23 种设计模式全面解析(超级详细)
  12. js JavaScript实战练习——小球碰撞反弹(详细)
  13. DHTMLX 使用汇总
  14. win7搜索网络计算机文件,Win7查找局域网共享文件的方法
  15. 因数分解——Pollard' p-1 Pollard rho
  16. 可视化全链路日志追踪
  17. Linux下连接mongoDB出现no reachable servers以及mongoDB创建用户
  18. office365 onedrive 教育版市场价位分析选购指南
  19. c语言报告对老师的致谢,论文对老师的致谢
  20. 中国大学MOOC胡浩基的机器学习第二章(支持向量机)兵王问题python版本——在python上初步使用libsvm

热门文章

  1. uefi windows10 linux,UEFI 启动GPT分区 Win10和Ubuntu16.04双系统安装
  2. element中form表单resetFields()方法重置表单无效
  3. PL/SQL生成表的数据结构关系图
  4. Spring→简介核心作用范围、框架、接口编程、IOC控制反转、单元测试、Bean容器、注入、作用域、生命周期、自动装配注入、自动扫描@注解
  5. JavaScript数据类型之Boolean以及undefined和null(4)
  6. 黑鲨怎么修改服务器,黑鲨研习win7系统DNS服务器更换的还原教程
  7. html登陆部分项目答辩演讲稿,D-POTDR项目答辩讲稿材料
  8. for循环执行 mybatis_MyBatis 插件机制详解
  9. android定位地点的保存,Android获得所有存储设备位置的最佳方法
  10. 设计模式—工厂模式(思维导图)