原则就是:修改新(旧)对象,不影响旧(新)对象!而且不一定产生新的对象!(划重点)
Mutablecopy返回的是一个可变的副本(新的对象,系统分配新的内存地址,修改副本不牵涉到源对象)
Copy返回的是一个不可变的副本(修改副本不牵涉到源对象;分不分配内存,看应用场景,下例)
当我们对一个不可变对象(NSString类型)使用copy关键字的时候,系统是不会产生一个新对象,因为原来的对象是不能修改的,拷贝出来的对象也是不能修改的,那么既然两个都不可以修改,所以这两个对象永远也不会影响到另一个对象(符合我们说的“修改新(旧)对象,不影响旧(新)对象”原则),系统为了节省内存,所以就不会产生一个新的对象了。
那么问题来了, copy到底是深拷贝还是浅拷贝?
我相信有的同学认为只要是使用copy关键字,那么肯定都是深拷贝,这样是很不严谨的,就比如上个例子,虽然使用了copy,但是指针地址是一样,那么它就应该是浅拷贝。
所以是否是深浅拷贝,是否创建新的对象,是由程序运行的环境所造成的,并不是一概而论。
对于NSArray,NSDictionary,道理也是相同的。