【问题标题】:Xcode Duplicate NSDictionaryXcode重复NSDictionary
【发布时间】:2015-08-08 12:05:56
【问题描述】:

我遇到了两本词典的问题。在我的头文件中,我声明了一个字典:

@property (strong, nonatomic) NSMutableDictionary *templateDictionary

templateDictionary 保存字符串和字典,例如 'blankCopy',后者又保存其他字符串和字典。我还在我的实现文件中声明了一个字典:

@property (strong, nonatomic) NSMutableDictionary *exampleDictionary

在我的实现中,我试图将 exampleDictionary 的一部分设置为 templateDictionary 的一部分,如下所示:

[self.exampleDictionary setObject:[templateDictionary objectForKey:@"blankCopy"] forKey:@"template"];

这一直有效,直到我在 exampleDictionary 的“模板”中更改任何内容。现在,当我回到 templateDictionary 时,它也发生了变化。我想这是因为它指向回来。我尝试了以下但都没有任何效果:

[self.exampleDictionary setObject:[[templateDictionary objectForKey:@"blankCopy"] copy] forKey:@"template"];
[self.exampleDictionary setObject:[[templateDictionary objectForKey:@"blankCopy"] mutableCopy] forKey:@"template"];
[self.exampleDictionary setObject:[NSMutableDictionary dictionaryWithDictionary:[templateDictionary objectForKey:@"blankCopy"]] forKey:@"template"];

关于什么是错的以及如何修复它,或者如何按值复制字典对象的任何想法?

【问题讨论】:

  • 我猜你将self.exampleDictionary 设置为在重新打开视图时始终调用的方法。 (viewwillappear 之类的)也许你应该在设置之前检查字典是否为空。
  • @LoVo 我在需要新模板时设置了 exampleDictionary,即“blankCopy”的一个版本,除了更新 exampleDictionary 总是以“blankCopy”不为空白结束!
  • [templateDictionary objectForKey:@"blankCopy"] 的对象数据类型是什么?
  • @iphonic 是 JSON 序列化创建的字典
  • 字典包含 POINTERS。如果将指针从一个字典复制到另一个字典,则不会创建指向对象的副本。

标签: ios objective-c xcode dictionary nsdictionary


【解决方案1】:

这里的问题是字典只保留对包含对象的引用。当您复制字典时,您只是在复制引用,而不是对象。因此,如果您在一个字典中修改某些内容,您会在另一个字典中看到它被修改。

解决方法是对字典的内容进行深拷贝,即对于字典中存储的每个对象,如果也是字典,则将其深拷贝并存储在新字典中。

您可以查看例如at this answer,它有实现。

【讨论】:

    【解决方案2】:

    首先,顺便说一句:您不需要这样做:

    [self.exampleDictionary setObject:[templateDictionary objectForKey:@"blankCopy"] forKey:@"template"];
    

    这更容易阅读:

    self.exampleDictionary[@"template"] = templateDictionary[@"blankCopy"];
    

    您会看到旧代码的写法与第一行一样,但对于新代码,第二行更可取。这种语法在 Xcode 中已经工作了至少两年了。

    您遇到的真正问题是[NSMutableDictionary mutableCopy] 只是一个浅拷贝——它是一个新字典,但字典中的值是引用的,而不是复制的。你需要一个深拷贝。查看http://samwize.com/2014/05/12/deep-copying-of-nsarray-slash-nsdictionary-slash-any-object/ 了解使用NSKeyedUnarchiver 的方法,或使用https://gist.github.com/yfujiki/1664847 了解直接(但更详细)的方法。

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 2014-04-16
      • 2016-02-23
      • 2017-07-23
      相关资源
      最近更新 更多