4

在 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

4 回答 4

5

因为有可能传入一个可变字符串。

(此外,IIRC-copy在不可变字符串上只是将其保留在引擎盖下。)

于 2013-05-05T20:36:03.923 回答
4

正如韦瓦所说;你不知道传入的字符串是否可变。在下面的例子中,如果你不复制的话,packet.itemName 最终会变成“fuffle”:

BNRItem *calculator = [[BNRItem alloc] init];
NSMutableString *pickle = [[NSMutableString alloc] initWithString:@"pickbarn"];
backpack.itemName = pickle;
[pickle setString:@"fuffle"];
于 2013-05-05T21:04:01.637 回答
3

我也研究过你提到的那本书和你上面写的程序。

在处理可变对象时使用 COPY。您可以使用 COPY 在特定时刻获取对象的值,并且在该特定时刻,该值将独立于对象的任何其他所有者所做的更改。

于 2013-05-05T20:38:09.803 回答
1
 NSString *pickle = @"pickbarn";

pickle 是一个指针。它指向内存中的一个 NSString。

 backpack.itemName = pickle;

现在你背包的 itemName 属性指向内存中相同的 NSString。

 pickle = @"fuffle";

pickle 现在指向内存中的一个新的 NSString。但是我们没有对背包的 itemName 属性做任何改动。它仍然指向@"pickbarn"内存中。

这将在您的属性strong或属性时以相同的方式工作copy

如果您想了解有关属性 ( copy, strong) 的更多信息,请查看此线程

于 2013-05-05T20:39:09.700 回答