9

NSCache を使用して PNG を NSData として保存しようとしています。キャッシュが空かどうかに関係なく、キャッシュから 1 つ取り戻そうとすると、次のようになります。

2012-10-26 09:49:28.860 SledMap[55917:11503] *キャッチされない例外 'NSUnknownKeyException' によりアプリを終了します。理由: '[ valueForUndefinedKey:]: このクラスは、キー 0_0_5 のキー値コーディングに準拠していません。

コードをそのままにして、NSCache を NSMutableDictionary に変更すると、問題なく動作します。

私は自分のキャッシュを宣言します:

@property (nonatomic, strong) NSCache *tileCache;

それを割り当てます(viewDidLoadで):

self.tileCache = [[NSCache alloc] init];
self.tileCache.delegate = self;

キャッシュに何かを追加します。

NSString *key = [NSString stringWithFormat:@"%i_%i_%i",x,y,endLevel];
NSData *pngData = [NSData dataWithData:UIImagePNGRepresentation(image)];
[self.tileCache setObject:pngData forKey:key];

そして、それを元に戻すと、上記のエラーが発生します。

NSString *key = [NSString stringWithFormat:@"%i_%i_%i",x,y,endLevel];
NSData *tile = [self.tileCache valueForKey:key];  //This is the line it crashes on

それが空の場合は、nil を返すだけだと思います。これは、self.tileCache を NSCache ではなく NSMutableDictionary にすると発生します。また、デバッグ領域では、次のように表示されます。

tile = NSData * 0x0134dc59 <Variable is not NSData>

NSString を渡すと、同じことが行われ、変数が NSString ではないと表示されます。

また、「A」になるようにハードコーディングkeyして、「A」として再度アクセスしようとすると、同じ結果になります。

何か案は?

4

2 に答える 2

23

-valueForKey:KVCメソッドです。使用する-objectForKey:

于 2012-10-26T20:30:15.697 に答える
-1

問題は NSData ではないと思います。キーに問題がある可能性があります。その stringWithFormat をよく見てください。%d は 32 ビットに準拠しているため、両方とも整数である場合は、おそらく %i の代わりに %d を使用する必要があります。フロートの場合は、%f を使用する必要があります。

于 2012-10-26T15:09:51.353 に答える