Objective C中的Mutable Copy有什么用

时间:2015-04-30 14:44:50

标签: ios objective-c copy nsmutablecopying

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

object1 = object2;

因此改变上面的一个对象会影响另一个。

MutableCopy是否相同? copy和MutableCopy有什么区别?

如何进行深层复制?

2 个答案:

答案 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