
什么是深拷贝、浅拷贝
浅拷贝:不拷贝对象本身,拷贝指向对象的指针,新指针指向被拷贝对象的内存地址。
深拷贝:拷贝新的对象和指针,指向新对象的内存地址,和被拷贝对象无关联。
对非容器类对象进行copy和mutalCopy


1.对非容器类不可变对象进行copy,是浅拷贝,指向的对象的内存地址相同,指针地址不相同。
2.对非容器类不可变对象进行mutalCopy,是深拷贝,拷贝新的对象和指针,指针地址以及指向的对象的内存地址都不相同。
3.对非容器类可变对象进行copy和mutalCopy,都是深拷贝,都会拷贝新的对象和指针,指针地址以及指向的对象的内存地址都不相同。
4.copy返回是不可变对象,mutalCopy返回的是可变对象,所以在进行[mutalCS appendString:@"456"]操作时,会返回Attempt to mutate immutable object with appendString:的错误。
对容器类对象进行copy和mutalCopy


2.对容器类不可变对象进行mutalCopy,是深拷贝,拷贝新的对象和指针,指针地址以及指向的对象的内存地址都不相同。
3.对容器类可变对象进行copy和mutalCopy,都是深拷贝,都会拷贝新的对象和指针,指针地址以及指向的对象的内存地址都不相同。
4.copy返回是不可变对象,mutalCopy返回的是可变对象.
从上面结论来看,容器类和非容器类对象的copy和mutalCopy结果是一样的,区别在于容器内的元素对象在容器类对象进行拷贝时,元素对象是进行指针复制,也就是浅拷贝。

编译时和运行时的类型问题
NSString * s = @"123";
NSString * mutalCopyS = [s mutableCopy];
NSMutableString * mutalCS = [s copy];
编译时,mutalCopyS是NSString类型,mutalCS是NSMutableString类型。
运行时,mutalCopyS是NSMutableString类型,mutalCS是NSString类型。