0

NSMutableDictionary を使用して、後で使用するデータをキャッシュしたいと考えています。私のカスタムオブジェクトは次のとおりです。

@interface MyData : NSObject {
    NSRange range;
    NSMutableArray *values;
}
@property (nonatomic, retain) NSMutableArray *values;

そして実装:

- (id)init {
    if (self = [super init]) {
        values = [[NSMutableArray alloc] init];
    }

    return self;
}

キャッシュしたいときは、次のように使用します。

NSMutableDictionary *cache = [[NSMutableDictionary alloc] init];
NSString *key = @"KEY";
MyData *data = [[MyData alloc] init];
// save some data into data
[data.values addObject:"DATA1"];
[data.values addObject:"DATA2"];
//... ...
[cache setObject:data forKey:key];

私の質問は、次のように後でこのオブジェクトを取得すると、cache.values のカウントがゼロになることです。

[cache objectForKey:@"KEY"];

「データ」を取得でき、オブジェクトのメモリアドレスは、キャッシュに入れたときのアドレスと同じです。どうしたの?親切な人たちの助けが必要です。どんな情報でも役に立ちます。ありがとう

4

2 に答える 2

0

Carl Norumが指摘したように、C文字列をに渡しますaddObject:addObject:、その名前が示すように、Cocoaオブジェクトへのポインタが必要です。C文字列は文字へのポインタです。そこでNSStringオブジェクトを渡す必要があります。リテラル文字列の場合、これには単に接頭辞を付ける必要があります@"Fred"は定数C文字列@"Fred"ですが、は定数NSStringオブジェクトです。

cacheインスタンスは変数ですか?そうではないようです。ローカル変数のように見えます。つまり、毎回新しいディクショナリオブジェクトを作成しています。そのため、新しい辞書には以前に(以前の辞書に)追加したものは何もありません。それはまた、あなたがそれらをリリースしていないので、あなたがそれらの以前の辞書を漏らしていることを意味します(とにかく、あなたが示したコードではありません)。

インスタンスcache変数を作成し、辞書がない場合(つまり、の場合cache == nil)にのみ辞書を作成します。メソッドで辞書を作成するのinitは良い方法の1つです。また、漏れやクラッシュが発生しないように、その寿命を適切に管理するようにしてください。

于 2010-09-05T04:07:38.677 に答える
0

まず、追加したオブジェクトが正しくないように見えます。文字列の前に @ が必要です。@「DATA1」のように

次に、オブジェクトをディクショナリまたは配列に追加しても、実際のコピーは作成されません。それへのポインタを作成するだけなので、それらのオブジェクトが破壊されたり、どこかに移動されたりすると、辞書からも削除されます。値のキャッシュを作成するより良い方法は、次のようにオブジェクトをコピーすることです。

MyData* cache = [[MyData alloc] init];

for (int i = 0; i < [data.values count]; i ++){{
    [cache.values addObject:[NSString stringWithString:[data.values objectAtIndex:i]]];
}

この状況では辞書を使用しないでください。

于 2010-09-05T14:34:28.230 に答える