我需要创建一个可以保存一些对象的缓存,但是,在某些时候,当我有内存警告或只是用户想要它时,我想清除所有使用 的实例>目前在缓存中。
换句话说:我需要使用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可能性吗?
答案 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
}
}
}