gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:31:21 25 4
gpt4 key购买 nike

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

换句话说:我需要取消初始化 ARC 计数 == 1 的对象。问题是根据我对这个项目的谷歌搜索,在纯 Swift 中不可能获得对象的保留计数。

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

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

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

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

我的一个想法是将我的缓存基于 WeakBoxes 数组,但是这样未使用的对象将在未使用时被释放,这不符合我的要求。

有人可以指导我实现这种目标的一些我不知道的 Swift 可能性吗?

最佳答案

您不需要弄乱对象的保留计数。您的缓存只能保存一个强引用。这保证了保留计数始终至少为 1。当您收到内存警告时,您只需遍历缓存中的每个指针并将其设置为 nil。假设没有其他人拥有强引用,这会将引用计数递减为零,并且该对象会立即调用 deinit 并耗尽内存。如果您真的希望对象在缓存清除时内存不足,请确保只有缓存对所保存的项目具有强引用,而其他所有人都采用弱引用。我有一个延迟加载的 ViewController 数组,它执行类似的操作:

    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
}
}
}

关于swift - 可以按需清除未使用对象的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40227977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com