gpt4 book ai didi

ios - 尝试读取无主引用但对象已被释放 Swift 5

转载 作者:行者123 更新时间:2023-12-01 15:44:28 24 4
gpt4 key购买 nike

我在释放变量时遇到问题:缓存

这是来自教程Reusable Image Cache in Swift

enter image description here

错误:

fatal error :尝试读取无主引用但对象 0x280208080 已被释放 fatal error :尝试读取无主引用但对象 0x280208080 已被释放

代码:

final class ImageLoader {

private let cache = ImageCache()

func loadImage(from url: URL) -> AnyPublisher<UIImage?, Never> {
if let image = cache[url] {
return Just(image).eraseToAnyPublisher()
}
return URLSession.shared.dataTaskPublisher(for: url)
.map { UIImage(data: $0.data) }
.catch { error in return Just(nil) }
.handleEvents(receiveOutput: {[unowned self] image in
guard let image = image else { return }
self.cache[url] = image
})
.subscribe(on: DispatchQueue.global(qos: .background))
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
}

最佳答案

这个错误有一个非常简单的解释:

当 URLSession 完成它的工作时, ImageLoader 的实例不存在,因为没有人保留对它的引用。当您只是在函数范围变量中创建该实例时,可能会发生这种情况。 (也许在某些功能中,例如 viewDidLoad)。
此崩溃很有用,因为它表示加载程序以错误的方式使用。如果使用弱自身或捕获整个实例,则不会发生崩溃,但是您将拥有很多具有自己缓存的 ImageLoader,其中只有一张图像。因此,它的含义不会有缓存。

为了解决这个问题,在创建 ImageLoader 实例之后,您应该将对它的引用保存在使用它的类/结构变量中,并将其传递给另一个需要相同缓存的消费者。 (依赖注入(inject)技术是一个很好的方法)。因此,一个包含一定数量项目的缓存将存在并且可以工作。

或者最简单的方法是创建一个 ImageLoader 的共享实例并仅使用它,因此它还保证它的一个实例具有一个已填充的缓存。

关于ios - 尝试读取无主引用但对象已被释放 Swift 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60237114/

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