2016-11-30 2 views
0

Является ли моей ответственностью поддерживать ссылку на Signal или SignalProducer, например, используя переменную экземпляра?Сохранение сигнала или сигнала?

Другими словами, они автоматически исчезнут и прекратят отправлять события, когда они освободятся?

ответ

1

FYI, не обязательно, Signal будет удаляться и останавливать события пересылки.

Signal - тип класса, если никто не имеет ссылки на него, он должен быть deinit. Однако реализация Signal вводит сложный способ сохранить себя, см. Свойство state, так что существует временная утечка памяти. Как видно из исходного кода, если есть некоторые наблюдатели, подписавшиеся на Signal, это state сохраняет его по очереди, пока все наблюдатели не отписали или не получили 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 тип, и вы не должны учитывать его продолжительность жизни.

Смежные вопросы