这是一个老生常谈的话题,面试中也经常被问到,下面总结一下自己的一些心得。
一句话总结:
浅拷贝就是指针拷贝;
深拷贝是对象本身的拷贝;
下面一张抽象的图可以直观的表述出两句话的内涵
其实这里还引申出了一个新的问题:为什么NSString要用copy修饰
在oc中父类的指针可以指向子类的对象,这一现象是oc中多态的一个特性。
假设声明了一个NSString对象,然后让它指向一个NSMutableString对象,这一点是完全可以的,因为NSMutableString的父类是NSSting。NSMutableString是一个可以改变的对象,如果我们用strong修饰,NSString对象强引用了NSMutableString对象。假如我们在其他的地方修改了这个NSMutableString对象,那么NSString的值会随之改变,但是我么你的本意是不让他改变,这就使得NSSting对象的值收到了NSMutableString 的印象。
这是我们就可以用copy,来重新生成一个对象。
但是,这里并不是简单的copy,其中还有各种情况出现
1、对NSString 进行copy -> 这是一个浅拷贝,但是因为是不可变对象,后期值也不会改变;
2、对NSString 进行mutableCopy -> 这是一个深拷贝,但是拷贝出来的是一个可变的对象NSMutableString;
3、对NSMutableString 进行copy -> 这是一个深拷贝,拷贝出来一个不可变的对象;
4、对NSmutableString 进行mutableCopy -> 这是一个深拷贝,拷贝出来一个可变的对象;
我们可以总结为:
对对象进行mutableCopy,不管是可变还是不可变对象都是深拷贝,并且拷贝出来的对象是可变的对象;
对对象进行copy,copy出来的对象是一个不可变的对象。