写在前面
这个问题是一个很经典的面试问题,每天都会遇到的问题,一般情况下不会出问题,但是需要总结记录一下。
由于NSMutableString是NSString的子类,所以一个NSString指针可以指向NSMutableString对象.
当原字符串是NSString时,由于字符串是不可变的,所以,不管是strong还是copy属性的对象,都是指向原对象,copy操作只是做了次浅拷贝。
当原字符串是NSMutableString时,strong属性只是增加了原字符串的引用计数,而copy属性则是对源字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。
这里还有一个性能问题,即在原字符串是NSMutableString,strong是单纯的增加对象的引用计数,而copy操作是执行了一深拷贝,所以性能上会有所差异。而如果原字符串是NSString时,则没有这个问题。
所以,我们一般采用copy修饰字符串,防止修改NSMutableString类型的字符串导致原来的数据被修改掉.