在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
从结果可知,直接赋值是浅拷贝,是指针赋值。
结果如下:
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,不再上图。