NSString这个类 , 字符串copy是非常特殊的,在各种应用场景下的拷贝是不同的!@property (nonatomic,copy)NSString *string; 这样写,在普通的情况下深拷贝mutableCopy 是深复制了一份内容,但是在- (id)mutableCopyWithZone:(nullable NSZone *)zone和
- (id)copyWithZone:(NSZone *)zone中,重新生成一份对象时,深拷贝mutableCopy字符串并没有重新生成一份指针与内容!如果这样写@property (nonatomic,strong)NSString *string;就可以!但是这样写,在外部copy时,并没有生成一份新的指针与内容
附上测试代码:
图一和图二一起看1
图一和图二一起看2
解决办法:
1:改为strong指针,则会完全生成一份新的实例变量
2:copy关键字不变,将[self.string mutableCopy]改为[[NSString alloc]initWithString:self.string]
3:注意:@property(nonatomic,copy)NSMutableString*string; 此时的字符串为不可变字符串,@property(nonatomic,strong)NSMutableString*string;此时会完全生成一份新的实例变量,但是考虑到此时存在的重新赋值等问题,不建议采用NSMutableString作为属性,使用时建议一律NSString 关键字使用copy,此时需要采用第二条方法!
4:为何会出现如此状况,可以在下面评论区讨论,源码应该可以看出一点门道!
5:以上结果有问题以及异议,还请评论一下!