0

含まれているメソッドを使用して、NSArray に含まれている NSMutableDictionary へのポインターを返しています。ただし、NSMutableArray (theOne) は変更不可能な NSDictionary として作成されています。このメソッドで辞書を取得した後に辞書を変更したいので、これは問題です。

- (NSMutableDictionary*)getMatFromBoutKey:(NSString*) boutKey
{   
    /*
     * Returns the mat object with the provided boutKey.
     * Returns nil if no mat has that boutKey.
     */

    NSUInteger idx = [[event objectForKey:@"mats"] indexOfObjectPassingTest:
                      ^ BOOL (NSMutableDictionary* obj, NSUInteger idx, BOOL *stop)
                      {
                          return [[obj objectForKey:@"boutKey"] isEqualToString:boutKey];
                      }];

    if (idx == NSNotFound)
        return nil;
    else {
        NSMutableDictionary* theOne = [[event objectForKey:@"mats"] objectAtIndex: idx];
        return theOne;
    }
}

これは、theOne が最初に参照された直後のブレークポイントで停止したデバッガーのイメージです。

theOne が可変でないことを示すデバッガーの画像

theOne が可変でないのはなぜですか? NSMutableDictionary へのポインターを返して、値が返された後に変更できるようにするにはどうすればよいですか?

ありがとう!

4

3 に答える 3

1

一般に、可変性が厳密に必要でない場合は、不変オブジェクトを操作する方がよいと思います。可変オブジェクトはより多くのメモリを使用し、もちろん誤って変更される可能性があります。たぶん、ブロック内が列挙子に変更されている可能性があります(わかりませんが、可能です。より高速なインデックス作成のために)。変更可能なオブジェクトを変更する場合は、を使用しmutableCopyます。または他の方法を使用します。

于 2012-08-10T02:46:19.027 に答える
1

配列の辞書があると仮定します。次に、その配列には一連の通常の辞書が含まれています。したがって、配列から引き出すと、割り当て先に関係なく、通常の辞書のままです。

たとえば、次のコードを例にとります

NSDictionary *dict = [[NSDictionary alloc] init];
NSMutableDictionary *mutDict = dict;

mutDict には、変更可能な辞書に適切にキャストされていないため、通常の辞書が含まれます。

[event objectForKey:@"mats"] にある配列を作成するときに、その中に NSMutable 辞書を配置するか、または

使用する

NSMutableDictionary* theOne = [[[event objectForKey:@"mats"] objectAtIndex: idx] mutableCopy];

データを持ち出すとき

于 2012-08-10T02:43:25.403 に答える
0

コードの他の場所で可変として挿入されていますか? そうでない場合は、mutableCopyメッセージを送信して可変コピーを取得できます (参照カウントが 1 であるため、必要に応じて必ず解放してください)。

于 2012-08-10T02:38:19.263 に答える