深拷贝、浅拷贝再回首

213 阅读2分钟

什么是深拷贝、浅拷贝

浅拷贝:不拷贝对象本身,拷贝指向对象的指针,新指针指向被拷贝对象的内存地址。

深拷贝:拷贝新的对象和指针,指向新对象的内存地址,和被拷贝对象无关联。

对非容器类对象进行copy和mutalCopy

结论:

1.对非容器类不可变对象进行copy,是浅拷贝,指向的对象的内存地址相同,指针地址不相同。

2.对非容器类不可变对象进行mutalCopy,是深拷贝,拷贝新的对象和指针,指针地址以及指向的对象的内存地址都不相同。

3.对非容器类可变对象进行copy和mutalCopy,都是深拷贝,都会拷贝新的对象和指针,指针地址以及指向的对象的内存地址都不相同。

4.copy返回是不可变对象,mutalCopy返回的是可变对象,所以在进行[mutalCS appendString:@"456"]操作时,会返回Attempt to mutate immutable object with appendString:的错误。

对容器类对象进行copy和mutalCopy

1.对容器类不可变对象进行copy,是浅拷贝,指向的对象的内存地址相同,指针地址不相同。

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类型。