Почему 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);
    }
}
Другие вопросы по тегам