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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。