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: 如果有不对的地方请指出,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容