Ios Xcode重复NSD字典

Ios Xcode重复NSD字典,ios,objective-c,xcode,dictionary,nsdictionary,Ios,Objective C,Xcode,Dictionary,Nsdictionary,我对两本字典有意见。在我的头文件中,我声明了一个字典: @property (strong, nonatomic) NSMutableDictionary *templateDictionary templateDictionary保存字符串和字典,例如“blankCopy”,后者反过来保存其他字符串和字典。我还在我的实现文件中声明一个字典: @property (strong, nonatomic) NSMutableDictionary *exampleDictionary 在我的实现中

我对两本字典有意见。在我的头文件中,我声明了一个字典:

@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"];

关于什么是错误以及如何修复它,或者如何通过值复制dictionary对象,有什么想法吗?

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

解决方案是深度复制字典的内容,也就是说,对于字典中存储的每个对象,如果它也是字典,则深度复制它并存储在新字典中


您可以查看具有实现的示例。

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

解决方案是深度复制字典的内容,也就是说,对于字典中存储的每个对象,如果它也是字典,则深度复制它并存储在新字典中


您可以查看具有实现的示例。

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

解决方案是深度复制字典的内容,也就是说,对于字典中存储的每个对象,如果它也是字典,则深度复制它并存储在新字典中


您可以查看具有实现的示例。

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

解决方案是深度复制字典的内容,也就是说,对于字典中存储的每个对象,如果它也是字典,则深度复制它并存储在新字典中


您可以查看具有实现的示例。

首先,旁白:您不需要这样做:

[self.exampleDictionary setObject:[templateDictionary objectForKey:@"blankCopy"] forKey:@"template"];
这更容易阅读:

self.exampleDictionary[@"template"] = templateDictionary[@"blankCopy"];
您将看到像第一行一样编写的旧代码,但对于新代码,第二行更可取。这种语法在Xcode中已经使用了至少两年了


真正的问题是,
[NSMutableDictionary mutableCopy]
只是一个浅拷贝——它是一个新字典,但字典中的值是引用的,而不是复制的。你需要一份深度副本。查看使用
NSKeyedUnarchiver
的方法或直接(但更详细)的方法。

首先,旁白:您不需要这样做:

[self.exampleDictionary setObject:[templateDictionary objectForKey:@"blankCopy"] forKey:@"template"];
这更容易阅读:

self.exampleDictionary[@"template"] = templateDictionary[@"blankCopy"];
您将看到像第一行一样编写的旧代码,但对于新代码,第二行更可取。这种语法在Xcode中已经使用了至少两年了


真正的问题是,
[NSMutableDictionary mutableCopy]
只是一个浅拷贝——它是一个新字典,但字典中的值是引用的,而不是复制的。你需要一份深度副本。查看使用
NSKeyedUnarchiver
的方法或直接(但更详细)的方法。

首先,旁白:您不需要这样做:

[self.exampleDictionary setObject:[templateDictionary objectForKey:@"blankCopy"] forKey:@"template"];
这更容易阅读:

self.exampleDictionary[@"template"] = templateDictionary[@"blankCopy"];
您将看到像第一行一样编写的旧代码,但对于新代码,第二行更可取。这种语法在Xcode中已经使用了至少两年了


真正的问题是,
[NSMutableDictionary mutableCopy]
只是一个浅拷贝——它是一个新字典,但字典中的值是引用的,而不是复制的。你需要一份深度副本。查看使用
NSKeyedUnarchiver
的方法或直接(但更详细)的方法。

首先,旁白:您不需要这样做:

[self.exampleDictionary setObject:[templateDictionary objectForKey:@"blankCopy"] forKey:@"template"];
这更容易阅读:

self.exampleDictionary[@"template"] = templateDictionary[@"blankCopy"];
您将看到像第一行一样编写的旧代码,但对于新代码,第二行更可取。这种语法在Xcode中已经使用了至少两年了


真正的问题是,
[NSMutableDictionary mutableCopy]
只是一个浅拷贝——它是一个新字典,但字典中的值是引用的,而不是复制的。你需要一份深度副本。查看使用
NSKeyedUnarchiver
的方法或直接(但更详细)的方法。

我猜您是在重新打开视图时始终调用的方法中设置了
self.exampleDictionary
。(视图将出现或其他内容)在设置词典之前,也许您应该检查词典是否为空。@LoVo每当我需要一个新模板,即“blankCopy”的版本时,我都会设置exampleDictionary,除非更新exampleDictionary时“blankCopy”总是不为空!
[templateDictionary objectForKey:@“blankCopy”]
的对象的数据类型是什么?@iphone它是由JSON SerialisationA创建的字典字典包含指针。如果将指针从一个字典复制到另一个字典,则不会创建指向的对象的副本。我猜您应该设置了
self。example dictionary