为什么 SDWebImage 在 NSCache 上使用 LOCK?

Why SDWebImage Used LOCK on NSCache?

NSCache 文档中 苹果说

You can add, remove, and query items in the cache from different threads without having to lock the cache yourself.

简而言之,他们不在 NSCache 上使用 LOCKHere's 他们的缓存实现。

他们有多种不同类型的缓存,唯一被包裹在LOCK/UNLOCK中的是weakCache:

@property (nonatomic, strong, nonnull) NSMapTable<KeyType, ObjectType> *weakCache; // strong-weak cache

这是 NSMapTable 的对象。 NSMapTable 不是 thread safe

// `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);
    }
}