objc NSString copy

关于 Objective-CNSString 在什么时候用 copy 的 特性

自己写了一段简单的代码

@property (nonatomic, copy) NSString *price;

NSMutableString *price = [NSMutableString stringWithFormat:@"100"];
Fruits *fruit = [[Fruits alloc] init];
fruit.price = price;
NSLog(@"price: %@", fruit.price);
[price setString:@"50"];
NSLog(@"setPrice: %@", fruit.price);

输出结果为

price: 100
setPrice: 100

@property (nonatomic, strong) NSString *price;

NSMutableString *price = [NSMutableString stringWithFormat:@"100"];
Fruits *fruit = [[Fruits alloc] init];
fruit.price = price;
NSLog(@"price: %@", fruit.price);
[price setString:@"50"];
NSLog(@"setPrice: %@", fruit.price);

输出的结果为

price: 100
setPrice: 50

我是分割线

@property (nonatomic, strong) NSString *price;

NSString *price = [NSString stringWithFormat:@"100"];
Fruits *fruit = [[Fruits alloc] init];
fruit.price = price;
NSLog(@"price: %@", fruit.price);
price = @"50";
NSLog(@"setPrice: %@", fruit.price);

输出结果为

price: 100
setPrice: 100

@property (nonatomic, copy) NSString *price;

NSString *price = [NSString stringWithFormat:@"100"];
Fruits *fruit = [[Fruits alloc] init];
fruit.price = price;
NSLog(@"price: %@", fruit.price);
price = @"50";
NSLog(@"setPrice: %@", fruit.price);

输出结果为

price: 100
setPrice: 100

总结

  • 凡是可以用 NSString 对象的地方,也可以用 NSMutableString 对象,因为 NSMutableStringNSString 的子类。
  • 真正的问题在于程序可能在 Fruits 对象不知情的情况下修改 price 变量所指向的 NSMutableString 对象
  • 如果你可以掌控自己应用程序中的所有代码,那就可以确保 price 变量所指向的 NSMutableString 对象不会被意外地修改。但是,这个一般我们都是团队开发,所以很难做到。所以还是要做好最坏的打算,编写具有“防御性”的代码
  • copy 方法返回的是拥有强引用特性的指针,而收到 copy 消息的 NSString 对象不会发生任何变化:该对象不会获得也不会失去拥有者,其数据也不会发生任何变化。
  • 只有是可变对象应该设置为 copy,而复制不可变对象会浪费内存空间--不可变对象不会发生(上述代码可参考),因为任何对象都无法修改它们。为了避免不必要的复制,向不可变对象发送 copy 消息时,会返回一个指向自己(仍然是不可变的)的指针。

PS: 如果有不对的地方请指出,谢谢!

你可能感兴趣的:(objc NSString copy)