保留在目标C中

Mat*_*rix 0 iphone

例如.

NSMutableString * str1 = [[NSMutableString alloc]initwithString:@"matrix"]; 
NSMutableString * str2 = [str1 retain]; // str2 = matrix - output
NSMutableString  * str3 = [str1 copy]; //str3 = matrix - output 
Run Code Online (Sandbox Code Playgroud)

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

mip*_*adi 40

str1并且str2是引用相同内存区域的指针.你的内存布局看起来大致如下: 替代文字

如果你改变str1点数,例如,通过这样做

str1 = @"new string";
Run Code Online (Sandbox Code Playgroud)

然后str2仍将引用"矩阵",但str1会引用"新字符串": 替代文字

但是,让我们说,那str1并且str2实际上指向了一个实例NSMutableString,而你这样做了:

[str2 setString:@"new string"];
Run Code Online (Sandbox Code Playgroud)

那么,请注意,str1并且str2仍将指向同一个对象,因此通过修改str2,str1也会更改为"新字符串".

浅拷贝与深拷贝

一个浅拷贝是一个对象在它的实例变量仍然指向相同的内存位置作为原始对象的实例变量的副本.一个深层副本是副本中的实例变量的副本也做了.

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

替代文字

  • 这些清晰图表的奖励积分.做得很好! (2认同)

Sha*_*rog 5

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

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

str1指向"矩阵",但是str2也指向"矩阵"?

是.

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

是.