【问题标题】:What does Mutable Copy in Objective C doObjective C 中的可变副本有什么作用
【发布时间】:2015-04-30 14:44:50
【问题描述】:

在objective C中,和C++语言一样,如果你将object分配给object,它会得到它的指向地址,如下所示:

object1 = object2;

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

MutableCopy 也一样吗?以及copy和MutableCopy有什么区别?

如何做深拷贝?

【问题讨论】:

  • “删除第一个字符串”具体是什么意思?不,mutableCopy 不是深拷贝。
  • 例如在应用程序的任何部分,如果我改变了firstString的值,secondString就会受到影响,有没有办法进行深拷贝?
  • " 如果我​​更改firstString 的值,则在应用程序的任何部分..." 所以firstStringNSMutableString,对吧?
  • 如果firstString 真的是NSMutableString,那么两个指针都会看到对可变字符串值的更改。如果firstString 真的是NSString,那么您可以更改firstString 的值,这样它就不会影响secondString

标签: ios objective-c copy nsmutablecopying


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多