Почему SDWebImage использовал LOCK на NSCache?
В документе NSCache Apple говорит
Вы можете добавлять, удалять и запрашивать элементы в кэше из разных потоков без необходимости самостоятельно блокировать кэш.
1 ответ
Решение
Короче говоря, они не используют LOCK
на NSCache
, Вот их реализация кэшей.
Они имеют несколько различных типов кеша, и единственный, который обернут в LOCK/UNLOCK, это weakCache
:
@property (nonatomic, strong, nonnull) NSMapTable<KeyType, ObjectType> *weakCache; // strong-weak cache
Который является объектом NSMapTable
, NSMapTable
не является потокобезопасным:
// `setObject:forKey:` just call this with 0 cost. Override this is enough
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g {
[super setObject:obj forKey:key cost:g];
if (!self.config.shouldUseWeakMemoryCache) {
return;
}
if (key && obj) {
// Store weak cache
LOCK(self.weakCacheLock);
[self.weakCache setObject:obj forKey:key];
UNLOCK(self.weakCacheLock);
}
}