读 YYCache 源码(1)
Contents
- (void)removeObjectForKey:(id)key {
if (!key) return;
OSSpinLockLock(&_lock);
_YYLinkedMapNode *node = CFDictionaryGetValue(_lru->_dic, (__bridge const void *)(key));
if (node) {
[_lru removeNode:node];
_YYLinkedMapNode *node = [_lru removeTailNode];
if (_lru->_releaseAsynchronously) {
dispatch_queue_t queue = _lru->_releaseOnMainThread ? dispatch_get_main_queue() : YYMemoryCacheGetReleaseQueue();
dispatch_async(queue, ^{
[node class]; //hold and release in queue
});
} else if (_lru->_releaseOnMainThread && !pthread_main_np()) {
dispatch_async(dispatch_get_main_queue(), ^{
[node class]; //hold and release in queue
});
}
}
OSSpinLockUnlock(&_lock);
}
_YYLinkedMapNode *node = [_lru removeTailNode];
中的 node 被注册到了 autoreleasepool
在接下来的 GCD 之舞中其实是用 GCD 来达到 ARC 下在指定线程中释放内存的目的。node 会被 block 捕获,随后会在 block 结束后,在对应的 queue 里得到释放。[node class];
这条语句,只是为了让 node 捕获到 block 去,所以随便发了个消息以避免被编译器优化掉。