例如。
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的内容会改变吗?
答案 0 :(得分:40)
str1
和str2
是引用相同内存区域的指针。你的内存布局看起来大致如下:
如果您更改str1
点的位置,例如,通过执行此操作
str1 = @"new string";
然后str2
仍将引用“矩阵”,但str1
将引用“新字符串”:
但是,假设str1
和str2
实际上指向了NSMutableString
的实例,而您这样做了:
[str2 setString:@"new string"];
请注意,str1
和str2
仍会指向同一个对象,因此通过修改str2
,str1
也会更改为“新字符串”。< / p>
浅拷贝是一个对象的副本,其实例变量仍然指向与原始对象的ivars相同的内存位置。 深层复制是一个副本,其中也会创建实例变量的副本。
假设您有一个类MyClass
,它有两个实例变量,每个变量都为NSString
类型。这是一个浅层和深层复制后内存布局大致如下的图表:
答案 1 :(得分:5)
第二行执行时会发生什么。 str1和str2是不同的对象吗?
没有。它们指向同一个对象,该对象现在的retain
计数为2.(init
递增此计数器)
str1指向“矩阵”,但是str2也指向“矩阵”?
是
如果我改变str1的内容,str2的内容会改变吗?
是