对象拷贝(复制对象)

1、复制对象顾名思义,复制一个对象作为副本,它会开辟一块新的一块内存(堆内存)来存储副本对象,就像复制文件一样。即源对象和副本对象是两块不同的内存区域。

 

2、NSObject类提供了copy和mutableCopy方法,通过这两个方法即可复制已有对象的副本。因此,对象想要具备复制功能,必须实现NSCopying或NSMutableCopy协议。

3、在iOSSDK中常 的可复制对象有:NSNumber、NSString 、NSArray、NSDictionary、NSMutableDictionary 、NSMutableArray、NSMutableString 
 
4、copy方法用于复制对象的不可变副本。通常来说,copy方法总是返回对象的不可修改的副本,即使该对象本就是可修改的。例如 :程序调用了NSMutableString的copy 法,将会返回不可修改的字符串对象。 
 
5、mutableCopy方法用于复制对象的可变副本。通常来说 ,mutableCopy 法总是返回该对象的可修改的副本,即使该对象是不可修改的,调 mutableCopy方法复制出来的副本也是可修改的。例如:程序调用了NSString的mutableCopy方法, 将会返回一个NSMutableString对象。 

6、浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间

浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,

要不然会成为野指针。如下图:

7、深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。如下图:

注意:NSString *str = @"XXXXXX";和NSString *str2 =[[NSString alloc] initWithString:@"XXXXXX"]的区别?

(对于str,系统会将str放入全局常量区,用户不能自己释放内存,而且你也释放不了;而对于str2,既然调用了alloc,说明用户已经自己申请内存了,那么就需要用户自己释放即[str2 realease],str2存放在堆中)

最新文章

  1. Objective-c的@property(atomic,nonatomic,readonly,readwrite,assign,retain,copy,getter,setter) 属性特性
  2. 自定义UITabBar的两种方式
  3. java ssl https 连接详解 生成证书
  4. 【持续集成】[Jenkins]Job中如何传递自定义变量
  5. ubuntu设置vim语法高亮显示和自动缩进
  6. 神器——Chrome开发者工具(一)
  7. Android平台对H264视频硬解码
  8. Chapter 15_2 编写模块的基本方法
  9. div无法跟随内容的增加而拉伸
  10. Python 之简单线程池创建
  11. shell 变量的间接引用
  12. json 的使用 Java对象转json
  13. PWD的编译及调试
  14. 【转】在Express项目中使用Handlebars模板引擎
  15. 数据库索引(Oracle和Mysql)学习总结
  16. Tmux 日常快捷键 及配置
  17. 【Android】android:windowSoftInputMode属性详解
  18. I2C总线通信
  19. 8、nginx和tengine简介
  20. Java并发编程_wait/notify和CountDownLatch的比较(三)

热门文章

  1. Java知多少(112)数据库之删除记录
  2. 技术总结之SpringIOC
  3. 介绍cms
  4. 《你不知道的javascript》一、函数作用域和块作用域
  5. python编码问题的最终分析
  6. 说说jsonp
  7. nodePPT初认识启动与手机控制
  8. WatiN框架学习
  9. 基于KV Data Model实现Table Data Model
  10. javascript类的理解和使用