为什么NSString属性使用copy

当你声明一个NSString属性时,使用copy比strong好。这同样适用于任何遵从NSCopying协议的可变类,比如NSNumber,NSArray,NSSet等等。所有上述类都有一个可变版本。建议使用copy是因为一个NSString属性可以被传入一个NSString或者NSMutableString实例。如果一个NSMutableString实例被传入那么就意味着这个字符串的值会在你无意识的情况下被改变。考虑下面这个例子:


@interface Book : NSObject

 

@property (strong, nonatomic) NSString *title;

 

@end


在另外一个类中有这个方法:


- (void)stringExample {

 

    NSMutableString *bookTitle = [NSMutableString stringWithString:@"Best book ever"];

 

    Book *book = [[Book alloc] init];

 

    book.title = bookTitle;

 

    [bookTitle setString:@"Worst book ever"];

 

    NSLog(@"book title %@", book.title);

}


当运行上述方法,我们会发现书名是: "Worst book ever"。如果我们在声明title属性时使用copy而不是strong,那么得到的书名将会是我们希望的 "Best book ever"。在第一个例子中,我们使用strong声明属性,那么被传入的string的引用计数将增加1,但是我们的属性将会指向相同的内存地址。这意味着任何一个持有指向该string内存地址的引用都可以改变string的值。如果使用copy,那么系统将会为Book类创建一个新的拷贝。这就意味着改变变量bookTitle不会对我们的属性值有任何影响。这其实才是我们在大多数情况下所希望的情形。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值