Objective c 复制不可变字符串?

Objective c 复制不可变字符串?,objective-c,Objective C,在BNR iOS的书中,作者说要把这本复制成,而不是strong: @property (nonatomic, copy) NSString *itemName; 但我并不真正理解它的目的,因为在我尝试的main方法中: BNRItem *calculator = [[BNRItem alloc] init]; NSString *pickle = @"pickbarn"; backpack.itemName = pickle; pickle

在BNR iOS的书中,作者说要把这本
复制成
,而不是
strong

@property (nonatomic, copy) NSString *itemName;
但我并不真正理解它的目的,因为在我尝试的
main
方法中:

BNRItem *calculator = [[BNRItem alloc] init];

        NSString *pickle = @"pickbarn";
        backpack.itemName = pickle;
        pickle = @"fuffle";

当我把
backpack
的名字打印到控制台时,它是
picklebarn
,所以我真的不明白为什么
itemName
需要被
copy

,因为可能会传入一个可变的字符串


(还有,IIRC,
-copy
在一个不可变的字符串上,只是把它保留在引擎盖下。)

我还研究了你提到的那本书和你上面写的程序

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

 NSString *pickle = @"pickbarn";
pickle是指针。它指向内存中的NSString

 backpack.itemName = pickle;
 pickle = @"fuffle";
现在,背包的itemName属性指向内存中相同的NSString

 backpack.itemName = pickle;
 pickle = @"fuffle";
pickle现在指向内存中的新NSString。但我们没有对背包的itemName属性进行任何更改。它仍然指向内存中的
@“pickbarn”

 backpack.itemName = pickle;
 pickle = @"fuffle";
当属性
strong
copy
时,这将以相同的方式工作


如果您想了解更多有关属性的信息(
copy
strong
),请查看;您不知道传入的字符串是否是可变的。 在以下示例中,如果您不复制,backpack.itemName将以“fuffle”结尾:

BNRItem *calculator = [[BNRItem alloc] init];
NSMutableString *pickle = [[NSMutableString alloc] initWithString:@"pickbarn"];
backpack.itemName = pickle;
[pickle setString:@"fuffle"];

“它被保留两次有害吗?”被难倒的-不。对象的每个“所有者”都会保留它。这样,每个所有者都可以在使用完对象后释放其retain,而无需与其他“所有者”进行协调。释放所有保留后,可以删除对象并回收空间。这被称为。这里所有答案的一个补充——在复制
NSString
的情况下,您不应该担心性能,因为它只是作为一个函数实现的。这就是为什么要对字符串使用
copy
:它对
NSString
便宜,对
NSMutableString
安全。这并不能回答问题。问题是为什么属性定义为
copy
,而不是
strong
。这是有区别的,但你的答案没有说明区别是什么。