可以根据需要清除未使用对象的缓存



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

也就是说:我需要定义ARC count == 1的对象。问题是,基于我的这个项目的谷歌搜索,这是不可能在纯Swift获得一个对象的保留计数。

从我的经验来看,这在Swift默认情况下是不可能的。在objective-c中,我使用代理对象,从缓存返回,它有这样的重写方法:

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

当然不适用于Swift的意识形态。

我的一个想法是把我的缓存建立在weakbox数组的基础上,但是这样一来,当它们不再使用时,未使用的对象将被释放,这不符合我的要求。

谁能给我一些Swift的可能性,我不知道,实现这样的事情?

您不需要更改对象的保留计数。缓存只能保存强引用。这保证了保留计数总是至少为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
            }
        }
    }

最新更新