可以按需清除未使用对象的缓存

时间:2016-10-24 21:38:33

标签: swift caching automatic-ref-counting swift3

我需要创建一个可以保存一些对象的缓存,但是,在某些时候,当我有内存警告或只是用户想要它时,我想清除所有使用 的实例>目前在缓存中。

换句话说:我需要使用ARC count == 1来删除对象。问题在于,基于我对此项目的Google搜索,在纯Swift中无法获取对象的保留计数。

根据我的经验,我发现在Swift默认情况下不可能。在objective-c我使用的是从缓存返回的Proxy对象,它有这样的覆盖方法:

    // Forward class checks for assertions.
-(BOOL)isKindOfClass:(Class)aClass {return [_target isKindOfClass:aClass];}

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    return(_target);
}

但当然不适用于斯威夫特的意识形态。

有人认为我的目标是将我的缓存基于WeakBoxes数组,但是这样未使用的对象在未使用时将被释放,并且不符合我的要求。

有人可以引导我去实现一些我不知道的Swift可能性吗?

1 个答案:

答案 0 :(得分:1)

您不需要弄乱对象的保留计数。您的缓存只能拥有强大的参考。这可以保证保留计数始终至少为1。当你收到内存警告时,你只需遍历缓存中的每个指针并将其设置为nil。假设没有其他人有强引用,则将引用计数减少为零,并且对象立即调用deinit并且内存不足。如果您真的希望在缓存执行清除时对象内存不足,请确保只有缓存具有对所持项目的强引用,并且其他所有人都使用弱引用。我有一个懒惰加载的ViewControllers数组,它们做了类似的事情:

    fileprivate var controllers = [UIViewController?](repeating: nil, count:  DashboardInfo.Category.allValues.count)

    override func didReceiveMemoryWarning() {
        //Release every off screen controller
        for index in 0 ..< controllers.count {
            if controllers[index] != currentController {
                controllers[index]?.removeFromParentViewController()
                controllers[index]?.view.removeFromSuperview()
                controllers[index] = nil
            }
        }
    }