NSString属性使浅拷贝

时间:2011-07-28 15:22:47

标签: iphone objective-c memory-management

我在理解在单独的类中声明的这两个字符串属性发生了什么时遇到了一些麻烦:

@property (nonatomic, copy) NSString *userPhone;

@property (nonatomic, copy) NSString *userLogin;

我在代码的某处执行以下操作:

user.userPhone = self.userLogin;

我期望将userLogin复制到新对象并分配给userPhone。但是,我发现他们都共享对同一个对象的引用!因此,当userLogin被释放时,userPhone也会被释放,打破我糟糕的应用。

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

有谁知道?

非常感谢

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:-1)

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

在阅读其他帖子后,我已经改变了我的思考。