NSString副本没有复制?

时间:2010-03-26 06:30:47

标签: iphone objective-c nsstring

  NSString *myString = @"sample string";
  NSString *newString = [myString copy];

如果我在这两行之后设置断点,myString的指针与newString的指针相同。

WTF?是不是NSString副本应该返回一个指向新对象的指针?或者我错过了关于副本应该如何工作的基本原理?

4 个答案:

答案 0 :(得分:9)

由于NSString 不可变,它可能会在内部增加ref count并完成它。

当你release其中一个NSStrings时,它可能会减少ref count - 标准内存管理。

你认为有什么问题吗?

答案 1 :(得分:7)

想一想:NSMutableStringNSString的子类。当您的财产被声明为NSString时,您不希望它发生变化。

考虑一下,如果您使用了retain并且有人给了您NSMutableString,然后稍后会更改它,那么您的课程就会被打破。

但是,您可能认为copy总是很慢。因此NSString copy只需拨打retainNSMutableString的{​​{1}}制作了一份真实副本。

通常最好将吐出copy,因为人们不必一直复制它。

答案 2 :(得分:2)

您可以像样本一样分配新变量

NSString *anotherString = [[NSString alloc] initWithString:originalString];

答案 3 :(得分:1)

复制方法返回的字符串值是一种更好的做法,因为返回的值可能是一个可变的字符串对象,并且该值可以在该方法返回后在其他线程中修改。