0

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

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

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

非常感谢!

4

2 回答 2

2

有一种简单的方法可以使用 NSCoding(序列化)协议获取 NSDictionary 或 NSArray的完整深度副本。

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

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

于 2013-02-20T08:08:44.007 回答
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);
于 2013-02-20T08:02:33.070 回答