【问题标题】:NSArray mutableCopy creates new array but still points to old contentsNSArray mutableCopy 创建新数组但仍指向旧内容
【发布时间】:2014-02-24 10:40:08
【问题描述】:

我的单例类中有一个名为playersArrayNSMutableArray,用于我的应用程序主数据源。 playersArray 的每个对象都是一个NSDictionary,内容如下:

{
    sgfID = 1;
    sgfPlayer = "<PlayerContact: 0xbf851b0>";
}

PlayerContact 是一个 NSObject 子类,包含以下属性: NSString * playerName, playerTeam, BOOL PlayerSelected 等等。

在我的一个 ViewController 中,在 viewDidLoad 中,我想将 playersArray 的深层副本放入名为 duplicatePlayersArrayNSMutableArray 中。我这样做是通过

playersArray = [[SGFHelper sharedHelpers] SGFContactsArray];
duplicatePlayersArray = [playersArray mutableCopy];

现在我有两个单独的副本,我的印象是 playerArray 和 duplicatePlayersArray 是内存中两个完全不同的数组。但是我发现它们不是!

即使调试器显示它们具有不同的内存地址,它们的内容也具有相同的内存地址。所以当我这样做时:

[((NSMutableDictionary *)[duplicatePlayersArray objectAtIndex:0]) setObject:@"333" forKey:@"sgfID"];

playersArray 的 index:0 处的字典也有“333”作为键“sgfID”,而不是之前运行上述代码行之前的“1”。

但是,如果我运行下面的代码,只有这样,两个数组才会开始不同

[duplicatePlayersArray replaceObjectAtIndex:0 withObject:tempDict];

这仍然没有解决我的问题,因为我想相信不同的两个数组仍然是“连接的”。一个改变,导致另一个数组改变它的内容。

各位朋友能否告诉我一种方法来深度复制我解释的数组的内容,其中所有内容都保存在不同的对象中。

【问题讨论】:

  • 它不是深拷贝,只是原始数组的副本,内容字典仍然相同
  • 文档中是否有任何内容让您相信它是深拷贝?

标签: ios iphone objective-c arrays deep-copy


【解决方案1】:

使用initWithArray:copyItems: 复制数组中的每个条目

NSMutableArray *duplicatePlayersArray = [[NSMutableArray alloc] initWithArray:playersArray copyItems:YES];

【讨论】:

  • 我正在试一试,会尽快通知您
  • 正如你所说,duplicatePlayersArray 现在有不同的内容,谢谢。但是现在,我无法更新它的内容。 Xcode 说 NSDictionary 不支持 setObject:ForKey:。但是,当我为 playerArray 运行代码时,我没有收到任何错误。不知何故,playersArray 中的东西已经变得不可变了。有没有办法可以复制 playerArray 的结果是可变的?或者只是以某种方式转换 duplicatePlayersArray?
  • 最好使用您在其中使用的确切代码创建一个新问题。
猜你喜欢
  • 2013-11-13
  • 2021-01-21
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多