NSCache:尝试访问缓存项时总是出现“未键值编码”的问题

10
我正在尝试使用NSCache将PNG存储为NSData。无论缓存是否为空,每当我尝试从缓存中获取一个数据时,都会出现以下信息:
2012-10-26 09:49:28.860 SledMap [55917:11503] * Terminating app due to uncaught exception 'NSUnknownKeyException',reason:'[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"访问它,结果也相同。

有什么想法吗?

2个回答

25

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


-1

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


如果我将密钥硬编码为仅为“A”或其他任何内容,则会获得相同的结果,并且在NSMutableDictionary而不是NSCache中使用上面的“key”可以起作用。 - Ryan Quick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接