测试发现了一个古怪的问题,App 在一些低端机上,自然息屏,再打开的时候 一些本地图片会不见了?(每次 didBecomeActive 的时候 会原地刷新一下)
经过各种尝试,有个小伙伴最终复现了对应场景。
立马进行 Debug
,发现在读取 本地图片资源的时候 就报错了。。。
这是个头疼的问题,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