系统容器类 例如NSArray、NSDictionary
obj2 = [obj1 copy]返回的必然是一个不可变对象,无论obj1是可变对象还是不可变对象。如果obj1是一个不可变对象,那么它们指向同一个对象。
obj2 = [obj1 mutableCopy]返回的必然是一个可变对象,无论obj1是可变对象还是不可变对象。即使obj1也是一个可变对象,它们仍指向不同地址,是两个对象。
========================
自定义类。
因为copyWithZone:和mutableCopyWithZone:完全由自己来实现,所以代码的不同实现方式,决定了返回对象是什么。
例如直接在copyWithZone:方法中return self;那么obj2 = [obj1 copy]相当于obj2 = obj1,即内容赋值,此时ob2j和obj1指针指的同样的内存地址,内容相同。
===========================
当数组A内部对象有数组B时,数组A里存的是B的指针,所以将Amutablecopy给C,A和C的指针地址虽然不同,但内容存的都是B的指针地址,所以修改一个中的B的值还是会影响另一个数组中B的值。也就是所谓的浅拷贝。
想要不影响,就要自己定义拷贝函数时,为内部的B也进行mutablecopy。就是深拷贝的意思,深入内部每一层进行拷贝。
============================
只要记住OC的对象都是指针表示的,对象间的赋值是把指针里存着的地址进行赋值,和基本数据类型一样,只是赋值内容,变量的地址还是不一样的。这些就很容易理解了。