2016-11-30 53 views

回答

1

仅供参考,并不必要,Signal将被布置和停止转发事件。

Signal是一个类型,如果没有人有对它的引用,应当DEINIT。 然而,Signal实现引入了一个棘手的办法留住自己,看到state财产,因此有暂时存在一些内存泄漏。从源代码可以看出,如果有一些观察者在Signal上订阅,它的确依次保留它,直到所有观察者退订或Signal收到完成/错误/中断事件。

这里有一些标记的代码片段。

// definition of SignalState 
private struct SignalState<Value, Error: Swift.Error> { 
    var observers: Bag<Signal<Value, Error>.Observer> = Bag() 
    var retainedSignal: Signal<Value, Error>? // here is the key 
} 

public func observe(_ observer: Observer) -> Disposable? { 
    var token: RemovalToken? 
    state.modify { 
     $0?.retainedSignal = self // retain self when one observer on 
     token = $0?.observers.insert(observer) 
    } 

    if let token = token { 
     return ActionDisposable { [weak self] in 
      if let strongSelf = self { 
       strongSelf.state.modify { state in 
        state?.observers.remove(using: token) 
        if state?.observers.isEmpty ?? false { 
         // break retain cycle when disposed 
         state!.retainedSignal = nil 
        } 
       } 
      } 
     } 
    } else { 
     observer.sendInterrupted() 
     return nil 
    } 
} 

SignalProducer怎么样?
这实在是直观的,SignalProducer只是struct类型,你不应该考虑它的使用寿命。