0

配列に値を追加し、その配列を辞書に保存しようとしています。実際、 にはセクションがありUICollectionView、各セクションにはアイテムが含まれています。配列がセクションの値を追加するたびに、それをディクショナリに追加してから配列をクリアし、次に配列が次のセクションの値を追加してディクショナリに入れますが、配列オブジェクトが削除されたときにディクショナリは値を保持していません。以下は私が試したコードです。

  NSMutableArray *arrStatus = [seatsDict objectForKey:0];
        if(arrStatus == nil)
        { 
            NSMutableArray *array = [NSMutableArray array];
            array = arrSeatsStatus;
            [seatsDict setObject:array forKey:[NSString stringWithFormat:@"%d",i]];
            i++;
            [arrSeatsStatus removeAllObjects];
        }
        else{       
        NSLog(@"arrStatus:%@", arrStatus);
        [seatsDict setObject:arrSeatsStatus forKey:[NSString stringWithFormat:@"%d",i]];
        i++;
        [arrSeatsStatus removeAllObjects];
        }

上記のコード配列 arrStatus は常に null ですが、辞書はそうではありません。上記のコードでは、望ましい結果が得られません。上記のコードは、配列がクリアされると辞書を空にします。以上をご案内します。

4

1 に答える 1

1

配列にポインターを追加しているため、辞書が配列を参照するときは、アイテムを削除した元の配列を参照しています。代わりに、ディクショナリだけに属する配列の別のインスタンスを作成する必要があります。mutableCopyメソッドはに属し、(不変であるため、アイテムを追加/削除することはできません)がある場合にインスタンスNSArrayを作成するために使用されます。代わりに、次のようにします。NSMutableArrayNSArray

    NSMutableArray *arrStatus = [seatsDict objectForKey:0];
    if(arrStatus == nil)
    { 
        NSMutableArray *array = [NSMutableArray array];
        array = [arrSeatsStatus copy];
        [seatsDict setObject:array forKey:[NSString stringWithFormat:@"%d",i]];
        i++;
        [arrSeatsStatus removeAllObjects];
    }
    else{       
        NSLog(@"arrStatus:%@", arrStatus);
        [seatsDict setObject:[arrSeatsStatus copy] forKey:[NSString stringWithFormat:@"%d",i]];
        i++;
        [arrSeatsStatus removeAllObjects];
    }

これでデータがコピーされ、個別に変更できるようになりました。メモリが心配な場合は、オブジェクトをディクショナリから削除すると、コピーされたオブジェクトのメモリの割り当てが解除されます。

于 2013-06-03T05:48:19.053 に答える