1.对可变对象进行copy操作
NSMutableString *mutaleStr = [NSMutableString stringWithString:@"mutaleStr"];
NSString *copyStr = [mutaleStr copy];
NSLog(@"mutaleStr:%p \n copyStr:%p",mutaleStr, copyStr);
结果:
mutaleStr:0x600000065400
copyStr :0x640420201410595
结论:对可变对象进行copy操作是内容copy(深copy)
猜想:如果将
NSString *copyStr = [mutaleStr copy];
改为
NSMutableString *copyStr = [mutaleStr copy];
后,进行
[copyStr appendString:@"sss"];
会发生什么?
结论:copyStr在编译时为NSMutableString,但是在运行时为NSString类型,所以对copyStr进行append等修改时,编译可通过,但运行时会崩溃。
2.对可变对象进行mutableCopy操作
NSMutableString *mutaleStr = [NSMutableString stringWithString:@"mutaleStr"];
NSMutableString *copyStr = [mutaleStr mutableCopy];
NSLog(@"mutaleStr:%p \ncopyStr:%p",mutaleStr, copyStr);
结果:
mutaleStr:0x600000063180
copyStr :0x6000000631c0
结论:对可变对象进行mutableCopy操作是是内容copy(深copy)
猜想:如果将
NSMutableString *copyStr = [mutaleStr mutableCopy];
改为
NSString *copyStr = [mutaleStr mutableCopy];
后,进行
[copyStr appendString:@"sss"];
会发生什么?
结论:copyStr在编译时为NSString,在运行时为NSMutableString,所以对copyStr进行append等修改时,编译时就会报错。
3.对不可变对象进行copy操作
NSString *str = [NSString stringWithFormat:@"mutaleStr"];
NSString *copyStr = [str copy];
NSLog(@"str:%p \ncopyStr:%p",str, copyStr);
结果
str :0x640420201410595
copyStr:0x640420201410595
结论:对不可变对象进行copy操作是指针拷贝(浅拷贝)
4.对不可变对象进行mutableCopy操作
NSString *str = [NSString stringWithFormat:@"mutaleStr"];
NSMutableString *mutableCopyStr = [str mutableCopy];
NSLog(@"str:%p \nmutableCopyStr:%p",str, mutableCopyStr);
结果:
str :0x640420201410595
mutableCopyStr:0x600000063180
结论:对不可变对象 进行mutableCopy操作是内容拷贝(深拷贝)
综上所述:只有对不可变对象进行copy操作是指针拷贝(浅拷贝),其他的都是内容拷贝(深拷贝)
看文字看的想睡觉,放张我喜欢的智妍刺激刺激昏昏欲睡的大脑
下面放几个实例:
@property (nonatomic, copy) NSString *name;
NSMutableString类型的变量对name赋值:
NSMutableString *mutaleStr = [NSMutableString stringWithString:@"mutaleStr"];
//赋值
self.name = mutaleStr;
NSLog(@"\nmutaleStr:%p\nname:%p",mutaleStr,self.name);
NSLog(@"\nmutaleStr:%@\nname:%@",mutaleStr,self.name);
// 操作1
[mutaleStr appendString:@"appendString"];
// 操作2
// mutaleStr = [NSMutableString stringWithString:@"resetValue"];
NSLog(@"\n改变后........");
NSLog(@"\nmutaleStr:%p\nname:%p",mutaleStr,self.name);
NSLog(@"\nmutaleStr:%@\nname:%@",mutaleStr,self.name);
/*
当name声明为copy时,为(内容copy)深copy
操作1和操作2都不会对self.name产生影响,因为是深copy
当name声明为strong,为(指针copy)浅copy
赋值:指向同一个地址,如果想产生copy的效果,可以这么赋值self.name = [mutaleStr copy];
操作1:对mutaleStr进行appendString,地址没变,内容改变了
结果:slef.name会随着mutaleStr改变而改变
操作2:对mutaleStr重新赋值,mutaleStr的地址和内容都改变了
结果:self.name不会变
*/
对NSString类型的变量对name进行赋值:
NSString *str = [NSString stringWithFormat:@"NSString"];
self.name = str;
NSLog(@"\nstr:%p\nname:%p",str,self.name);
NSLog(@"\nstr:%@\nname:%@",str,self.name);
/*
不论name声明为strong还是copy都是浅拷贝
*/
结论:这就是为什么很多大牛推荐用copy的原因,因为你不知道在声明Strong的情况下,会出现了莫名其妙的bug,所以说论写代码习惯的重要性。
@property (nonatomic, copy) NSMutableString *name;
NSMutableString类型的变量对name赋值:
结论同上,如果name声明为strong的时候,如果对self.name进行append操作,也会反向同样影响mutaleStr的值
NSString类型的变量对name进行赋值:
如果name是strong类型,则是深copy;
如果name是copy类型,则是浅copy,但是之前说了,如果copy过来了,在编译时是没有问题的,但是会在运行时报错.
网友评论