一、提出问题。
问题一:
一个对象 的字符串用 copy进行修饰,外界修改这个字符串的数值,会导致引用的这个字符串数值修改吗?
NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copy
NSString *stringCopy = [string copy];
[string appendString:@"origion!"]
1、string的内存地址和stringCopy的是否一样?
2、此时stringCopy的打印内容是什么?
问题二、
@property(nonatomic,copy)NSString * str1;
@property(nonatomic,strong)NSString*str2;
NSMutableString*str=[NSMutableString stringWithFormat:@"helloworld"];
self.str1=str;
self.str2=str;
1、str和str1的内存地址和str和str2的内存地址,是什么关系,相等,不相等?
2、[str appendString:@"hry"],经过这个方法之后,str1和str2的数值分别是多少?是不是都是 helloworldhry。
二、解决问题
字典,数组,字符串都有可变对象。
1、当我们把 可变对象通过 copy赋值一个 不可变对象或者可变对象,是深复制,也就是地址复制了一份,避免了原始可变对象的修改引起后来copy的对象的修改,上述问题2,srt1是属性copy,所以str的的变化不会引起str2的变化。但是str2使用 strong修饰,因为是地址复制了一份,指向的是同一块内容。原来地址内容发生变化,它的内容也会变化。
2、区分源头,上述是讲的可变对象,对于源头是不可变的对象,copy和strong修饰的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。
三、为什么有这两个属性修饰
应该是用的场景不一样,当我们改变源头(源头是可变的)的时候,也期望引用这个源头的所有对象都会随着改变。而strong修饰象实现了这次的跟随改变。如果你用copy修饰不可变对象的话,copy产生的对象是不可变的,修饰可变对象发生崩溃。
源头对象用什么修饰,传递对象用什么修饰,最终使用对象用什么修饰。使用的对象希望跟随源头变化进行,中间属性修饰最好用strong,一层层传递。也可以采用其他编程方法。
本文侧重,讲述copy和strong的区别和用法。场景很多。
网友评论