Memory leaks Swift Combine-zip运算符是否保留其没有的所有值';你没有机会发表吗?

Memory leaks Swift Combine-zip运算符是否保留其没有的所有值';你没有机会发表吗?,memory-leaks,timer,zip,combine,publisher,Memory Leaks,Timer,Zip,Combine,Publisher,下面是我想知道的代码: final class Foo { var subscriptions = Set<AnyCancellable>() init () { Timer .publish(every: 2, on: .main, in: .default) .autoconnect() .zip(Timer.publish(every: 3, on: .m

下面是我想知道的代码:

final class Foo {
    
    var subscriptions = Set<AnyCancellable>()
    
    init () {
        Timer
            .publish(every: 2, on: .main, in: .default)
            .autoconnect()
            .zip(Timer.publish(every: 3, on: .main, in: .default).autoconnect())
            .sink {
                print($0)
            }
            .store(in: &subscriptions)
    }
}

这段代码最终会因为内存不足而崩溃吗?似乎zip操作符正在存储它接收到但尚未发布的所有值。

zip
没有限制其上游缓冲区大小。你可以这样证明:

import Combine

let ticket = (0 ... .max).publisher
    .zip(Empty<Int, Never>(completeImmediately: false))
    .sink { print($0) }

zip
不限制其上游缓冲区大小。你可以这样证明:

import Combine

let ticket = (0 ... .max).publisher
    .zip(Empty<Int, Never>(completeImmediately: false))
    .sink { print($0) }

我想说你的假设是正确的-Zip将容纳越来越多的更快计时器的值。当然,它需要很长的时间来积累足够的时间使应用程序崩溃。每隔6秒,它会保存一个额外的日期对象。不确定Date对象有多大,但如果它是,比如说8字节,那么要达到100米,需要大约900天(如果我计算正确的话)我想你的假设是正确的-Zip将容纳越来越多的更快计时器的值。当然,要积累足够的时间来崩溃应用程序需要很长的时间。每隔6秒,它会保存一个额外的日期对象。不确定Date对象有多大,但如果它是,比如说8字节,那么要达到100米,需要大约900天(如果我计算正确的话)
  66.07 MB      99.8%   174      main
  64.00 MB      96.7%   45        Publisher<>.sink(receiveValue:)
  64.00 MB      96.7%   42         Publisher.subscribe<A>(_:)
  64.00 MB      96.7%   41          Publishers.Zip.receive<A>(subscriber:)
  64.00 MB      96.7%   12           Publisher.subscribe<A>(_:)
  64.00 MB      96.7%   2             Empty.receive<A>(subscriber:)
  64.00 MB      96.7%   2              AbstractZip.Side.receive(subscription:)
  64.00 MB      96.7%   2               AbstractZip.receive(subscription:index:)
  64.00 MB      96.7%   2                AbstractZip.resolvePendingDemandAndUnlock()
  64.00 MB      96.7%   2                 protocol witness for Subscription.request(_:) in conformance Publishers.Sequence<A, B>.Inner<A1, B1, C1>
  64.00 MB      96.7%   2                  Publishers.Sequence.Inner.request(_:)
  64.00 MB      96.7%   1                   AbstractZip.Side.receive(_:)
  64.00 MB      96.7%   1                    AbstractZip.receive(_:index:)
  64.00 MB      96.7%   1                     specialized Array._copyToNewBuffer(oldCount:)
  64.00 MB      96.7%   1                      specialized _ArrayBufferProtocol._forceCreateUniqueMutableBufferImpl(countForBuffer:minNewCapacity:requiredCapacity:)
  64.00 MB      96.7%   1                       swift_allocObject
  64.00 MB      96.7%   1                        swift_slowAlloc
  64.00 MB      96.7%   1                         malloc
  64.00 MB      96.7%   1                          malloc_zone_malloc