copy和mutableCopy和直接赋值的区别

在iOS中常见的赋值方式有三种,分别是直接赋值、copy赋值、mutableCopy赋值。那么这三种赋值方式有什么区别呢?

在ChinaCocoa论坛的一个帖子中我看到了如下的说法(地址:http://www.cocoachina.com/bbs/read.php?tid-135884.html)。

1、非容器对象

对不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。

对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。

2、容器对象

对于容器本身,同非容器对象。

但是,对于容器内的对象,则都是指针复制。真正的深拷贝(即容器本身、容器内的对象均为深拷贝),

本着实事求是的原则,我进行了一些测试。

首先拿容器对象Array来进行测试,代码如下:


直接赋值

结果如下:

2015-12-01 16:01:20.113 iOS7CookBook[2920:110384] 1

2015-12-01 16:01:20.113 iOS7CookBook[2920:110384] 2

2015-12-01 16:01:20.114 iOS7CookBook[2920:110384] 3

从结果可知,直接赋值是浅拷贝,是指针赋值。


copy赋值

结果如下:

2015-12-01 16:02:57.797 iOS7CookBook[2976:111457] 1

2015-12-01 16:02:57.797 iOS7CookBook[2976:111457] 2

从结果可知,copy赋值是深拷贝,是对象复制。

mutableCopy的测试结果和copy相同,不再上图。两者的区别就是返回的对象的类型分别为__NSArrayM和__NSArrayI,前者是可变数组,后者是不可变数组。

Dictionary测试结果同Array,不再上图。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 不敢说覆盖OC中所有copy的知识点,但最起码是目前最全的最新的一篇关于 copy的技术文档了。后续发现有新...
    zyydeveloper阅读 3,421评论 4 35
  • 讨论主题 下列代码中:为什么用实例变量初始化的可变数组添加对象元素成功,而用self.属性的方式初始化的可变数组添...
    星期五__阅读 1,056评论 2 2
  • 其实我一直对于例如属性中的copy OR [array copy]这样的使用稀里糊涂的。之前有总结过,无奈现在又忘...
    升级打怪啊怪阅读 1,268评论 0 3
  • 这些天没有很晴朗,没有暖暖的阳光,也没有静好的月光,然后忽然之间有种明媚的感觉,说不清,道不明 一直都很困...
    熊清阅读 264评论 0 1
  • 天堂-地狱-天堂-地狱 再到现在的平淡 以后应该也都将其归之于平淡 没有谁比自己更了解自己的经历 生活体验 但有些...
    0半斤0阅读 202评论 0 0