1

在目标 C 中,与 C++ 语言相同,如果将对象分配给对象,它将获得其指向地址,如下所示:

object1 = object2;

因此,更改上述对象之一将影响另一个对象。

MutableCopy 也一样吗?复制和 MutableCopy 有什么区别?

如何做深拷贝?

4

2 回答 2

2

inObjective C与 in 有不同的内存管理模型C++,因此您不能只删除firstString- 您应该删除对它的所有强引用。在这种情况下,您创建了强引用。当您重新分配secondString时,它将指向另一个对象。所以NSString是不可变的。

可变副本创建另一个字符串对象,您可以对其进行变异

于 2015-04-30T14:52:45.380 回答
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
于 2015-04-30T15:11:08.710 回答