NSString *myString = @"sample string";
NSString *newString = [myString copy];
如果我在这两行之后设置断点,myString的指针与newString的指针相同。
WTF?是不是NSString副本应该返回一个指向新对象的指针?或者我错过了关于副本应该如何工作的基本原理?
答案 0 :(得分:9)
由于NSString
不可变,它可能会在内部增加ref count
并完成它。
当你release
其中一个NSStrings时,它可能会减少ref count
- 标准内存管理。
你认为有什么问题吗?
答案 1 :(得分:7)
想一想:NSMutableString
是NSString
的子类。当您的财产被声明为NSString
时,您不希望它发生变化。
考虑一下,如果您使用了retain
并且有人给了您NSMutableString
,然后稍后会更改它,那么您的课程就会被打破。
但是,您可能认为copy
总是很慢。因此NSString
copy
只需拨打retain
。 NSMutableString
的{{1}}制作了一份真实副本。
通常最好将吐出copy
,因为人们不必一直复制它。
答案 2 :(得分:2)
您可以像样本一样分配新变量
NSString *anotherString = [[NSString alloc] initWithString:originalString];
答案 3 :(得分:1)
复制方法返回的字符串值是一种更好的做法,因为返回的值可能是一个可变的字符串对象,并且该值可以在该方法返回后在其他线程中修改。