2

考虑这个示例代码(缓存是 NSCache 的一个实例):

- (id)objFromCache
{
    if ([cache objectForKey:@"myObject"] == nil)
        [cache setObject:[self generateObject] forKey:@"myObject"];

    return [cache objectForKey:@"myObject"];
}

我应该相信这段代码吗?我的意思是,objectForKey:@"myObject"之后会返回 nilsetObject:forKey:@"myObject"吗?if如果是这样,我应该换成while谁?

处理这种情况的最佳方法是什么?谢谢!

4

1 回答 1

4

至少在多线程环境中,您不能假设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;
}
于 2013-05-19T14:10:30.457 回答