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

このようにして、任意のオブジェクトとそれに含まれるすべてのオブジェクトを 1 つのステップで複製できます。

于 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 に答える