Contents

YYCache https://github.com/ibireme/YYCache

- (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 去,所以随便发了个消息以避免被编译器优化掉。

Contents