NSString *myString = @"sample string";
NSString *newString = [myString copy];
如果我在这两行后面设置断点,则myString的指针与newString的指针相同。NSString复制不复制?
WTF?是不是NSString复制应该返回一个指向新对象的指针?或者我错过了一些关于拷贝应该如何工作的基础知识?
NSString *myString = @"sample string";
NSString *newString = [myString copy];
如果我在这两行后面设置断点,则myString的指针与newString的指针相同。NSString复制不复制?
WTF?是不是NSString复制应该返回一个指向新对象的指针?或者我错过了一些关于拷贝应该如何工作的基础知识?
由于NSString
是不可变它可能只是在内部增加ref count
并完成它。
当您release
其中一个NSStrings它可能只是递减ref count
- 标准内存管理。
你看到有什么问题吗?
想一想:NSMutableString
是NSString
的子类。当你的财产被宣布为NSString
时,你不希望它改变。
考虑一下,如果你使用retain
和有人给你NSMutableString
然后后来改变它,你的班级将被打破。
但是,您可能认为总是copy
ing是缓慢的。所以NSString
的copy
只需调用retain
。 NSMutableString
的copy
进行实际复制。
通常吐出一个NSString *
更好,因为人们不必一直复制它。
复制方法返回的字符串值是一种更好的做法,因为返回的值可能是可变的字符串对象,并且可以在该方法返回后在其他线程中修改此值。
您可以分配新的变量像样品
NSString *anotherString = [[NSString alloc] initWithString:originalString];
我不知道答案,但如果你改变的myString则有两种不同的地址......直到字符串的内容是相同的是在同一地址... – 2010-03-26 06:41:45
首先,你实际上没有调用copy,你叫做stringWithString :.其次,由于字符串是不可变的,因此编译器和运行时会进行优化。通常不可变对象将返回一个额外的引用计数,而不是创建一个实际的新对象。 – 2010-03-26 06:41:48
可可之美 - 不需要复制数据时的副本...... – stefanB 2010-03-26 06:45:27