2010-03-26 68 views
6
NSString *myString = @"sample string"; 
    NSString *newString = [myString copy]; 

如果我在这两行后面设置断点,则myString的指针与newString的指针相同。NSString复制不复制?

WTF?是不是NSString复制应该返回一个指向新对象的指针?或者我错过了一些关于拷贝应该如何工作的基础知识?

+0

我不知道答案,但如果你改变的myString则有两种不同的地址......直到字符串的内容是相同的是在同一地址... – 2010-03-26 06:41:45

+2

首先,你实际上没有调用copy,你叫做stringWithString :.其次,由于字符串是不可变的,因此编译器和运行时会进行优化。通常不可变对象将返回一个额外的引用计数,而不是创建一个实际的新对象。 – 2010-03-26 06:41:48

+0

可可之美 - 不需要复制数据时的副本...... – stefanB 2010-03-26 06:45:27

回答

9

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

当您release其中一个NSStrings它可能只是递减ref count - 标准内存管理。

你看到有什么问题吗?

6

想一想:NSMutableStringNSString的子类。当你的财产被宣布为NSString时,你不希望它改变。

考虑一下,如果你使用retain和有人给你NSMutableString然后后来改变它,你的班级将被打破。

但是,您可能认为总是copy ing是缓慢的。所以NSStringcopy只需调用retainNSMutableStringcopy进行实际复制。

通常吐出一个NSString *更好,因为人们不必一直复制它。

1

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

1

您可以分配新的变量像样品

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