Iphone NSString属性生成浅拷贝

Iphone NSString属性生成浅拷贝,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我在理解在不同类中声明的这两个字符串属性时遇到了一些问题: @property(非原子,复制)NSString*userPhone 及 @property(非原子,复制)NSString*userLogin 在代码的某个地方,我执行以下操作: user.userPhone=self.userLogin 我所期望的是userLogin被复制到一个新对象中,并分配给userPhone。然而,我发现它们都共享对同一对象的引用!所以当userLogin发布时,userPhone也会发布,破坏了我糟糕的应

我在理解在不同类中声明的这两个字符串属性时遇到了一些问题:

@property(非原子,复制)NSString*userPhone

@property(非原子,复制)NSString*userLogin

在代码的某个地方,我执行以下操作:

user.userPhone=self.userLogin

我所期望的是
userLogin
被复制到一个新对象中,并分配给
userPhone
。然而,我发现它们都共享对同一对象的引用!所以当
userLogin
发布时,
userPhone
也会发布,破坏了我糟糕的应用程序

我知道我在这里遗漏了一些关于内存管理的内容,但我不明白为什么
copy
在这种情况下不起作用

有人知道吗


非常感谢

您可能会双倍发布原版。如果我记得的话,copy属性实际上只是保留一个不可变的副本(即NSString),并且只有在它是可变的(NSMutableString)时才执行硬拷贝。可能原始字符串是自动释放的,您会给它一个硬释放,考虑到两个减量。 编辑:


在阅读了其他帖子后,我改变了我的想法。

NSString
对象是不可变的,这意味着一旦创建了它们,它们的内容就不能更改。要利用这一点,
copy
方法不会创建新字符串。相反,它保留原始字符串*。从您的角度来看,这是一个内部优化标准内存管理规则适用。如果在您预期之前对字符串进行
dealloc
处理时遇到问题,您必须在其他地方过度释放它


stringWithString:
也以相同的方式进行内部优化。如果将不可变字符串作为参数传递,则不会创建新字符串*。如果执行以下代码,您将看到string1和string2地址相同

NSString *string1 = @"Test";
NSString *string2 = [NSString stringWithString:string1];
NSLog(@"%p, %p",string1, string2);

(*)这些是随时可能更改的实施细节。

是否
@synthesis
@dynamic
,如果您
@synthesis
是否覆盖了setter?这应该是另一个对象。。。你不是在别的地方有一个userPhone=self.userLogin吗?是的,我做了
@synthesis
,我没有覆盖setter@Rabskatran不,我在那一行检查了,copy使两个都指向同一个对象NSString的
copy
中的优化不应该破坏你的程序。如果是,则说明您的程序有问题。谢谢,但我想知道为什么
copy
无法按预期工作。您可能正在双重发布原始版本。如果我记得的话,copy属性实际上只是保留一个不可变的副本(即NSString),并且只有在它是可变的(NSMutableString)时才执行硬拷贝。因此,如果您需要不可变字符串的保证硬拷贝,您可能必须使用stringWithString
stringWithString:
也在内部进行了优化,以利用
NSString
s是不可变的这一事实,并且它将返回作为参数传递的相同对象(只要它是不可变的),这不能像
copy
那样保证实际的单独实例。即使我们使用NSMutableString而不是NSString,方法“stringWithString:”仍将导致浅拷贝?@hemant否,如果调用
[NSString stringWithString:mutableString]
[NSMutableString stringWithString:immutableString]
,它将创建一个新字符串。