2016-11-30 46 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類型,你不應該考慮它的使用壽命。