【问题标题】:Clear copied dictionary清除复制的字典
【发布时间】:2016-08-13 12:44:31
【问题描述】:

最近我创建了一个关于清除字典的帖子,如 key->value(NSArray)。

我有 2 个 NSDictionary,第一个包含数据,第二个应该包含第一个的所有键,但该键的数据为空。稍后将添加/删除数据。这就是我从主数据字典(self.viewModel.releaseDict)创建副本的方式:

_releaseFormsDictCopy = [NSMutableDictionary dictionaryWithDictionary:self.viewModel.releaseDict];

当我检查时,对象(2 个 NSDictionaries)有不同的内存。

但是,当我用方法“清除”副本时:

-(void)clearAllArraysInsideKeys{

    for(id key in self) {
        NSMutableArray *arr = [self objectForKey:key];
        [arr removeAllObjects];
    }
}

似乎它会刷新两个字典中的所有数据,而不仅仅是复制。如何防止清除第一个 NSDictionary?

【问题讨论】:

    标签: ios objective-c nsdictionary


    【解决方案1】:

    您的字典可能是不同的实例,但它们的内容仍然是相同的实例 - 您创建了一个浅(可变)副本。根据您的描述,您想要的是一个深层副本,其中字典是不同的实例,并且它们包含的每个数组作为值也是不同的实例。

    简单的选项是仅深复制该级别。创建一个空的NSMutableDictionary,然后枚举self.viewModel.releaseDict,并为每个键添加一个mutableCopy的值。

    这将是字典的“深度”副本,包含它所包含的每个数组的“浅”副本。

    【讨论】:

    • 我想这会起作用,谢谢。我试图做更简单的解决方案 - NSArray *arr = @[]; _releaseFormsDictCopy = [NSMutableDictionary dictionaryWithObjects:arr forKeys:_sectionsArray]; 但是,它会抛出异常。我在这里做错了什么?
    • 你创建了一个不可变数组,所以我想以后你会尝试将它用作可变数组?
    • 不,它在那一行抛出异常。NSArray *arr = @[]; _releaseFormsDictCopy = [NSMutableDictionary dictionaryWithObjects:arr forKeys:_sectionsArray];,
    • 哦,我明白了,你给它一个非空键列表的空值列表,你不能这样做......
    • hm,不是真的空的,一个nil对象的数组,是不是禁止特定键有空数组?
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2017-06-01
    • 2017-04-18
    • 2013-01-24
    相关资源
    最近更新 更多