版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337880
关于NSString要用Copy来修饰这个问题,我不多说只是摆出代码:
// 深复制
Person * xiaoMing = [Personallocinit];
NSMutableString * name = [NSMutableStringallocinitWithString:@"xiaoming"];
// name.string = @"xiaoming";
xiaoMing.name = name;
NSLog(@"%@", xiaoMing.name);
name appendString:@"hah";
// 此时名字这个属性被修改了
NSLog(@"%@", xiaoMing.name);
如果用Copy来修饰name这个属性不会改变,如果使用Strong,当name这个字符串改变的时候,name这个属性也会随着改变。
xiaoMing.name = name;(此时name是用copy修饰的) 等同于 xiaoMing.name = name copy;(copy对可变对象进行的是深拷贝,此时是拷贝出了一个新的对象然后赋值给了xiaoMing.name mutableCopy对所有的对象进行的都是深拷贝)
补充:这其实也是看需求,看被赋值的字符串是否需要随着赋值字符串的变化而变化,而大多数情况下我们不希望被赋值的字符串如某个对象的某个字符串类型的属性会随着赋值字符串的变化而变化。 反之,如果我们希望被赋值的字符串随着赋值字符串的变化而变化,那么我们也可以使用strong来修饰字符串(赋值字符串和被赋值字符串说的好像挺绕口啊)。注:赋值字符串既然可变,那它就必然是可变字符串。
至于其底层原理区别则是两种修饰方式让指针指向的内存地址不同。使用copy修饰被赋值字符串,被修饰字符串会对赋值字符串(可变字符串)进行一次深拷贝,那么被赋值字符串和赋值字符串指向的是完全不同的两块内存地址,反之两者指向的同一块内存地址。
当我们确定赋值字符串是不可变字符串的时候我们是可以使用strong来修饰字符串。
联想:由copy修饰字符串想到的用strong修饰数组,原理是一样的,当我们用strong来修饰不可变数组的时候,如果赋值数组是可变数组,那么被赋值数组同样会随着可变数组的变化而变化。