Swift合并关闭内部弱对无主

uinbv5nw  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(76)

我不明白在合并闭包中使用self的正确方法

class ViewModel {
    var requestPublisher = PassthroughSubject<Void, Never>()
    var nextPageAvailabe = true
    private var subscriptions = Set<AnyCancellable>()

    init() {
        setupSubscriptions()
    }

    setupSubscriptions() {
        requestPublisher
        .filter { _ in self.nextPageAvailabe }
        .sink(receiveValue: {
            print("Received request")  
        }).store(in: &subscriptions)
    }
}

requestPublisher.send()从父类执行。使用.filter { _ in self.nextPageAvailabe }会导致内存泄漏。所以我需要在filter {}中使用[weak self][unowned self]。这两种方法都解决了内存泄漏问题,但我不明白正确的方法。我读了几篇文章,但没有找到答案。那么在合并闭包中使用self的正确方法是什么呢?

r55awzrz

r55awzrz1#

weak绝对是正确的选择:你将只有一个可选的self。当weak变量被释放时,它将变成nil。
unowned应该尽可能避免,因为它不是执行阶段安全的:它就像weak,但结果不是可选的。所以如果你试图在一个无主变量被释放后使用它,应用程序只会崩溃。

setupSubscriptions() {
        requestPublisher
        .filter { [weak self] _ in self?.nextPageAvailabe ?? false }
// I have put `?? false` because I suppose that if self is nil, then page is not available...
        .sink(receiveValue: {
            print("Received request")  
        }).store(in: &subscriptions)
    }

相关问题