Objective c 复制不可变字符串?
在BNR iOS的书中,作者说要把这本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
复制成,而不是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
。这是有区别的,但你的答案没有说明区别是什么。