9

我正在尝试使用 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为“A”并尝试再次以“A”的形式访问它,结果相同。

有任何想法吗?

4

2 回答 2

23

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

于 2012-10-26T20:30:15.697 回答
-1

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

于 2012-10-26T15:09:51.353 回答