NSCache:尝试访问缓存项时始终获得“不符合键值编码”

时间:2012-10-26 15:03:03

标签: objective-c ios cocoa nscache

我试图使用NSCache将PNG存储为NSData。每当我试图从高速缓存中退出时,无论缓存是否为空,我都会得到:

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设为NSMutableDictionary而不是NSCache时会发生的事情。此外,在调试区域中,它说:

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

如果我传入一个NSString,它会做同样的事情,并且变量不是NSString。

另外,我可以硬编码key成为&#34; A&#34;并尝试再次访问它&#34; A&#34;结果相同。

有什么想法吗?

2 个答案:

答案 0 :(得分:20)

-valueForKey:是一种KVC方法;使用-objectForKey:

答案 1 :(得分:-1)

我不认为问题是NSData,我认为它可能与您的密钥有关。仔细看看stringWithFormat - 如果它们都是整数,你应该使用%d而不是%i,因为%d符合32位。如果它们是浮动的,你应该使用%f。