复制不可变的字符串?

时间:2013-05-05 20:29:45

标签: objective-c

在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

4 个答案:

答案 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"

当您对属性strongcopy进行归因时,这将采用相同的方式。

如果您想了解有关属性的更多信息(copystrong),请查看this thread