为什么 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
上使用 LOCK
。 Here'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);
}
}
在 NSCache 文档中 苹果说
You can add, remove, and query items in the cache from different threads without having to lock the cache yourself.
简而言之,他们不在 NSCache
上使用 LOCK
。 Here'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);
}
}