OC中的字符串属性(深拷贝和浅拷贝)

我们在项目中定义一个字符串属性的时候,有时候见到别人用retain,有时候见到用copy。那么到底这两种用法有什么区别呢?
这就需要我们了解深拷贝和浅拷贝和区别了。
其实copy是创建一个新对象,retain是创建一个指针。 Copy其实是建立了一个相同的对象,而retain不是。怎么理解呢? 比如我们有一个NSString对象,地址为0×1212,内容为@”str” 。Copy到另外一个NSString之后,地址为0×2222,内容相同也是@”str”,新的对象retain为1,旧有对象没有变化 。而如果是retain到另外一个NSString之后,内容相同@”str”,并且地址也形同为0×1212,这个对象的retain值会+1。 也就是说,retain是指针拷贝,copy是内容拷贝。retain只是简单的又创建出了另外一个指针,同时指着那个内存为0×1212的字符串。
所以,如果用copy出来一个NSString对象,那么这个NSString对象的内容改了,原来的那个NSString对象是不会改变的,因为它们的指针指的不是同一个地址。而如果用retain创建出来一个NSString对象,确切的说不能是创建对象,应该是只创建一个指针(copy是创建一个内存地址并加上一个指针),指向原来的那个对象内存地址。那么这个NSString对象的内容变了,原来的那个对象内容也会跟着改变的。一般情况下,当遇NSString时,用copy和retain都行,但是copy比用retain安全。比如到当用NSMutableString,那么就要用copy,NSMutableString的值不会被修改,而用retain的时候,NSMutableString的值会被修改
如果以上语言解释的还不是很懂的话,下面我们用个例子也解释一下:

#import <Foundation/Foundation.h>

@interface person : NSObject
@property (nonatomic,copy)NSString * name;
    person * p  = [[person alloc]init];

    NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"];
    p.name = name;

    [name appendString:@" word"];
    NSLog(@"%@",p.name);

打印后结果是

hello

再看下面用retain

#import <Foundation/Foundation.h>

@interface person : NSObject

@property (nonatomic,retain)NSString * name;
    person * p  = [[person alloc]init];

    NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"];
    p.name = name;

    [name appendString:@" word"];
    NSLog(@"%@",p.name);

打印结果是:

hello word

现在清楚两者的区别了吧。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值