iOS 绕过 `Too many open files` 本地图片加载失败问题

测试发现了一个古怪的问题,App 在一些低端机上,自然息屏,再打开的时候 一些本地图片会不见了?(每次 didBecomeActive 的时候 会原地刷新一下)

image.png

经过各种尝试,有个小伙伴最终复现了对应场景。

立马进行 Debug,发现在读取 本地图片资源的时候 就报错了。。。

image.png
image.png

这是个头疼的问题,Too many open files google 一下也搞不定。 自己也很难定位具体的原因(哪里文件打开过了,根本不知道。。。),该问题在 AppStore(release) 包上不会复现,(可能跟 Debug模式下,有代码偷偷做了什么。。。)

Too many open files 我们解决不了,那有别的方式绕过这个问题吗?

记录页面原地刷新?如何不空大?

下面是核心代码:


@interface IMYImageMemoryCache ()
@property (nonatomic, strong) YYMemoryCache *memoryCache;
@property (nonatomic, strong) NSMapTable *weakCache;
@property (nonatomic, strong) dispatch_semaphore_t dsem;
@end

@implementation IMYImageMemoryCache

- (id)objectForKey:(id)key {
    if (!key) {
        return nil;
    }
    id obj = [_memoryCache objectForKey:key];
    if (!obj) {
        dispatch_semaphore_wait(_dsem, DISPATCH_TIME_FOREVER);
        obj = [_weakCache objectForKey:key];
        dispatch_semaphore_signal(_dsem);
        if (obj) {
            NSUInteger cost = IMYCacheCostForImage(obj);
            [_memoryCache setObject:obj forKey:key withCost:cost];
        }
    }
    return obj;
}

- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g {
    if (!key) {
        return;
    }
    [_memoryCache setObject:obj forKey:key withCost:g];
    dispatch_semaphore_wait(_dsem, DISPATCH_TIME_FOREVER);
    [_weakCache setObject:obj forKey:key];
    dispatch_semaphore_signal(_dsem);
} 

@end

问题1:为啥 MemoryCache 找不到 Image了,而 WeakMap 里面还有?

问题2:该方案还有其他运用场景吗?

这次的方案来自 SDWebImage 5.x 版本的 SDMemoryCache

你可能感兴趣的:(iOS 绕过 `Too many open files` 本地图片加载失败问题)