2

私は ObjectiveC と Xcode を初めて使用し、間違いを犯します。このコードは、getAllRecords から辞書 (myDataPlist) を取得します。次に、(myDataPlist) 内の辞書 (1 レコード) の変更可能なコピーを作成し、それを使用して 1 つのフィールドを復号化します。これは完全に機能します。そのレコード (mutCopy) だけを返します。これも機能します。私の問題は、元の辞書 (myDataPlist) の変更です。復号化されたレコードは、(myDataPlist) でも復号化されます。2 つの NSLog(@"%@",myDataPlist) は異なる結果を返します。私は何かが欠けているに違いない。(myDataPlist) が変更されるのはなぜですか?

助けてくれてありがとう。

-(NSDictionary *)getRecordForKey:(NSString *)key{

    NSDictionary *myDataPlist = [self getAllRecords];
    NSMutableDictionary *mutCopy = [[myDataPlist valueForKey:key] mutableCopy];
    NSArray *keys = [mutCopy allKeys];
    NSData *tData = [[NSData alloc]init];
    NSLog(@"%@",myDataPlist);
    for (int x = 0; x <= [keys count] - 1; x++) {
        if (![keys[x] isEqualToString:@"Template"] && ![keys[x] isEqualToString:@"RecNum"]) {

        NSMutableArray *myArray = [mutCopy objectForKey:keys[x]];
        tData = myArray[1];
        NSString *tString = [tData decryptData:tData withKey:self.settingsManager.masterPad];
        myArray[1] = tString;
        [mutCopy setObject:myArray forKey:keys[x]];

        }
    }
    NSLog(@"%@",myDataPlist);
    return mutCopy ;
}
4

1 に答える 1

3

mutableCopyディクショナリの内容ではなく、ディクショナリのコピーのみを作成します。したがって、受け取るディクショナリ[[myDataPlist valueForKey:key] mutableCopy]は基本的に、同じオブジェクトへの参照を持つ新しいディクショナリです (ディープ コピーではありません)。

使ってみて

NSMutableDictionary *mutCopy = 
    [[NSMutableDictionary alloc] initWithDictionary:[myDataPlist valueForKey:key] 
                                          copyItems:YES];

の代わりにmutableCopy

Apple のドキュメントから:

その他の辞書

新しいディクショナリを初期化するためのキーと値を含むディクショナリ。

国旗

YES の場合、otherDictionary の各オブジェクトは copyWithZone: メッセージを受け取り、オブジェクトのコピーを作成します。オブジェクトは NSCopying プロトコルに準拠する必要があります。マネージ メモリ環境では、これはオブジェクトが受信する保持メッセージの代わりになります。オブジェクトのコピーは、返されたディクショナリに追加されます。NO の場合、マネージ メモリ環境では、otherDictionary 内の各オブジェクトは、返されたディクショナリに追加されるときに保持メッセージを受け取るだけです。

辞書にカスタム オブジェクトが含まれている場合は、それらが NSCopying プロトコルに準拠していることを確認してください。

于 2013-04-23T02:10:37.993 に答える