在目标C中,与C ++语言相同,如果将对象分配给对象,它将获得如下指向地址:
object1 = object2;
因此改变上面的一个对象会影响另一个。
MutableCopy是否相同? copy和MutableCopy有什么区别?
如何进行深层复制?
答案 0 :(得分:2)
在Objective C
中,存在与C++
不同的内存管理模型,因此您不能只删除firstString
- 您应该删除对它的所有强引用。在这种情况下,您创建强大的参考。当您重新分配secondString
时,它将指向另一个对象。所以NSString
是不可变的。
可变副本创建另一个字符串对象,你可以改变它
答案 1 :(得分:1)
是的,mutableCopy(和副本)是一个深层副本。
请参阅以下测试代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *string1 = @"string1";
NSString *string2 = string1;
NSLog(@"Test 1(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string1 = nil;
NSLog(@"Test 2(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string1 = string2;
NSLog(@"Test 3(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string2 = [string1 mutableCopy];
NSLog(@"Test 4(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
}
它产生以下输出。将string2分配给string1时,您可以看到内存位置相同。在测试4中,在mutableCopy之后,内存位置发生了变化。
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 1(0x103021068, 0x103021068): String 1: string1; String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 2(0x0, 0x103021068): String 1: (null); String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 3(0x103021068, 0x103021068): String 1: string1; String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 4(0x103021068, 0x7f9a23d71b30): String 1: string1; String 2: string1