保留在目标C中

时间:2010-09-02 18:03:08

标签: iphone

例如。

NSMutableString * str1 = [[NSMutableString alloc]initwithString:@"matrix"]; 
NSMutableString * str2 = [str1 retain]; // str2 = matrix - output
NSMutableString  * str3 = [str1 copy]; //str3 = matrix - output 

第二行执行时会发生什么。 str1和str2是不同的对象? str1指向“矩阵”,但是str2也指向“矩阵”?如果我改变str1的内容,str2的内容会改变吗?

2 个答案:

答案 0 :(得分:40)

str1str2是引用相同内存区域的指针。你的内存布局看起来大致如下: alt text

如果您更改str1点的位置,例如,通过执行此操作

str1 = @"new string";

然后str2仍将引用“矩阵”,但str1将引用“新字符串”: alt text

但是,假设str1str2实际上指向了NSMutableString的实例,而您这样做了:

[str2 setString:@"new string"];

请注意,str1str2仍会指向同一个对象,因此通过修改str2str1也会更改为“新字符串”。< / p>

浅拷贝与深拷贝

浅拷贝是一个对象的副本,其实例变量仍然指向与原始对象的ivars相同的内存位置。 深层复制是一个副本,其中也会创建实例变量的副本。

假设您有一个类MyClass,它有两个实例变量,每个变量都为NSString类型。这是一个浅层和深层复制后内存布局大致如下的图表:

alt text

答案 1 :(得分:5)

  

第二行执行时会发生什么。 str1和str2是不同的对象吗?

没有。它们指向同一个对象,该对象现在的retain计数为2.(init递增此计数器)

  

str1指向“矩阵”,但是str2也指向“矩阵”?

  

如果我改变str1的内容,str2的内容会改变吗?