为什么用copy for NSString属性?

当你声明一个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”。如果我们声明属性的为copy代替Strong,我们的书的标题就会变成“Best book ever”。在第一种情况下,当我们声明属性Strong,字符串的retain count将增加1,但我们的属性将指向同一个内存地址。这意味着任何人都可以改变的value持有一个内存地址的引用,在我们的案例中bookTitle变量。如果相反的我们使用copy,那么将会创建一个新的字符串复制我们的书类。这意味着修改booTitle不会有任何影响我们的字符串值,在大多数情况下这是我们想要的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值