考虑此示例代码(缓存是NSCache的一个实例):
- (id)objFromCache
{
if ([cache objectForKey:@"myObject"] == nil)
[cache setObject:[self generateObject] forKey:@"myObject"];
return [cache objectForKey:@"myObject"];
}
我应该相信这段代码吗?我的意思是,objectForKey:@"myObject"
之后setObject:forKey:@"myObject"
会不会立即返回?如果是这样,我应该将if
更改为while
吗?
处理这种情况的最佳方法是什么?谢谢!
答案 0 :(得分:3)
至少在多线程环境中,您不能假设NSCache
返回对象
你刚插入的。
此外,如果第一个调用[cache objectForKey:@"myObject"]
未返回nil
,则return语句中的第二个调用可能会返回nil
。
所以我会安全地播放你的方法
- (id)objFromCache
{
id value = [cache objectForKey:@"myObject"];
if (value == nil) {
value = [self generateObject];
[cache setObject:value forKey:@"myObject"];
}
return value;
}