NSString深浅复制的见解


对于不可变的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返回的对象是不可变的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值