測試發(fā)現(xiàn)了一個古怪的問題,App 在一些低端機上,自然息屏,再打開的時候 一些本地圖片會不見了?(每次 didBecomeActive 的時候 會原地刷新一下)

image.png
經(jīng)過各種嘗試,有個小伙伴最終復現(xiàn)了對應場景。
立馬進行 Debug,發(fā)現(xiàn)在讀取 本地圖片資源的時候 就報錯了。。。

image.png

image.png
這是個頭疼的問題,Too many open files google 一下也搞不定。 自己也很難定位具體的原因(哪里文件打開過了,根本不知道。。。),該問題在 AppStore(release) 包上不會復現(xiàn),(可能跟 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