修改新词典中的内容也会修改父词典数据

时间:2013-02-20 07:55:16

标签: iphone ios objective-c nsmutabledictionary

由于我需要在数组中添加类似的对象,因此我以这种方式创建了新的字典。

NSMutableDictionary* existingStepDict = [[[arrayForSteps objectAtIndex:0] mutableCopy] autorelease];
[arrayForSteps addObject:existingStepDict];
[existingStepDict release];

现在,这里发生的事情是,当我在任何一个字典中更改某些内容时,另一个也会更新。我要求这两个词典都独立行事。

为此,我浏览了代码如下的字典的深层副本。

   NSMutableDictionary* existingStepDict = [[[arrayForSteps objectAtIndex:0] mutableCopy] autorelease];

   NSMutableDictionary* destination = [NSMutableDictionary dictionaryWithCapacity:0];

   NSDictionary *deepCopy = [[NSDictionary alloc] initWithDictionary:existingStepDict copyItems: YES];
   if (deepCopy) {
        [destination addEntriesFromDictionary: deepCopy];
        [deepCopy release];
   }
   //add Properties array to Steps Dictionary
   [arrayForSteps addObject:destination];

但这并没有反映出差异。我知道我在这里犯了一些小错误。 但有人可以帮助我得到我的结果吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

使用NSCoding(序列化)协议可以轻松获得NSDictionary NSArray的完整深度复制。

- (id) deepCopy:(id)mutableObject
{
    NSData *buffer = [NSKeyedArchiver archivedDataWithRootObject:mutableObject];
    return [NSKeyedUnarchiver unarchiveObjectWithData: buffer];
}

通过这种方式,您可以在一个步骤中复制任何对象及其包含的所有对象。

答案 1 :(得分:1)

当我需要NSDictionary的可变深度副本时,我使用此方法创建了一个类别:

- (NSMutableDictionary *)mutableDeepCopy
{
    NSMutableDictionary *returnDict = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
    NSArray *keys = [self allKeys];

    for (id key in keys) {
        id oneValue = [self valueForKey:key];
        id oneCopy = nil;
        if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) {
            oneCopy = [oneValue mutableDeepCopy];
        } else if ([oneValue respondsToSelector:@selector(mutableCopy)]) {
            oneCopy = [oneValue mutableCopy];
        }
        if (oneCopy == nil) {
            oneCopy = [oneValue copy];
        }

        [returnDict setValue:oneCopy forKey:key];
    }

    return returnDict;
}

修改 并在网上搜索我发现了这个,我还没有测试过

NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)originalDictionary, kCFPropertyListMutableContainers);