对于不可变的NSString来说,使用retain与copy的效果都是一样的 ,引用计数增加,但是对于可变的NSMutableString来说就不尽相同了,如果是不可变的[string copy],这只是简单地的浅复制,并没有创建一个新的地址空间出来 ,只是创建了一个指针指向原来的地址空间,也就是说如果原来那空间的值变了,那么指针指向的值也会改变,但是如果是可变的NSMutableString而言,copy就是深复制, 也就是说会创建出另一块空间,这块空间与原来的空间以没有关系,并不会受原来那块空间的影响,以后即使原来空间的值改变,这块空间的值也是不会改变,使用copy来申明NSString不只是引用计数会改变,还会涉及深浅拷贝的问题,所以使用NSSring时应该申明为Copy属性。
如果只是涉及NSString而言,copy与retain无区别 都是浅复制
@property (nonatomic,copy)NSString * cStr;
@property (nonatomic,strong)NSString *rStr;
@property (nonatomic,copy)NSMutableString *cMutStr;
@property (nonatomic,strong)NSMutableString *rMutStr;
NSString * str =@"我来了";
self.cStr = str;
self.rStr = str;
self.cMutStr = str;
self.rMutStr = str;
str =@"我走了";
以上的值都是@"我来了" 不会变 由于str指向的是常量区的值 str的地址发生改变 而其他的地址相同 所以值不会改变
而如果是NsmutableString来说 声明copy就相当于深复制 会完全拷贝出另一块地址空间 retian只是简单地引用计数增加
NSMutableString * mutstr = [NSMutableStringstringWithString:@"我没变"];
self.cStr = mutstr;
self.rStr = mutstr;
self.cMutStr = mutstr;
self.rMutStr = mutstr;
[mutstr setString:@"我变了"];
其中self.cStr self.cMutStr不会发生改变 依然是@"我没变",其他三个的地址相同,而self.cStr self.cMutStr的地址与其他的都不相同,由此可以得出对于NSmutableString而言,copy就是深复制会创建出一块新的空间
*浅复制就是指针复制 出现两个指针 一块地址空间 旧指针和复制指针指向同一块地址空间 如果源地址数据改变 那么两个指针指向的值就会改变
深复制就是指针与空间同时复制 出现两个指针 两块地址空间 互不影响 如果源地址数据变化 复制指针与空间不受影响。
*对于系统的非容器类对象,我们可认为,如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutbleCopy就是对象复制(深拷贝),如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。