在BNR iOS手册中,作者说这是copy
而不是strong
:
@property (nonatomic, copy) NSString *itemName;
但我并没有真正理解这个目的,因为在main
方法中我试过了:
BNRItem *calculator = [[BNRItem alloc] init];
NSString *pickle = @"pickbarn";
backpack.itemName = pickle;
pickle = @"fuffle";
当我将backpack
的名称打印到控制台时,它是picklebarn
,所以我真的不明白为什么itemName
需要copied
?
答案 0 :(得分:5)
因为可能传入可变字符串。
(另外,对于不可变的字符串,IIRC,-copy
只是将它保留在引擎盖下。)
答案 1 :(得分:4)
正如Wevah所说;你不知道传入的字符串是否可变。 在下面的示例中,如果您不复制,backpack.itemName将最终成为“fuffle”:
BNRItem *calculator = [[BNRItem alloc] init];
NSMutableString *pickle = [[NSMutableString alloc] initWithString:@"pickbarn"];
backpack.itemName = pickle;
[pickle setString:@"fuffle"];
答案 2 :(得分:3)
我还研究了你提到的那本书以及你上面写的程序。
当您处理可变对象时使用COPY。您可以使用COPY在特定时刻获取对象的值,并且在该特定时刻,此值将独立于对象的任何其他所有者所做的更改。
答案 3 :(得分:1)
NSString *pickle = @"pickbarn";
pickle是一个指针。它指向内存中的NSString。
backpack.itemName = pickle;
现在你的背包的itemName属性指向内存中的相同NSString。
pickle = @"fuffle";
pickle现在指向内存中的新NSString。但是我们没有改变背包的itemName属性。它仍然指向内存中的@"pickbarn"
。
当您对属性strong
或copy
进行归因时,这将采用相同的方式。
如果您想了解有关属性的更多信息(copy
,strong
),请查看this thread。