2014-11-19 13 views

risposta

28

No, non è necessario in questo caso. animations e completion non vengono conservati da self quindi non vi è alcun rischio di un ciclo di conservazione forte.

+1

C'è un modo per creare chiusure come 'animazioni' o' completamento' qui? – WildCat

+0

Perché non usano la parola chiave noescape? – Plot

+0

@Plot UIKit è scritto in Objective-C ed è interpolato in Swift. Objective-C non ha la funzione '@ noescape'. – Kirsteins

6

Bene, "necessario" non è uguale a "consigliato". Se la tua domanda è se è necessario, la risposta di @Kirsteins va bene, tuttavia immagina la situazione in cui desideri animare qualcosa nel tuo controller di visualizzazione dopo un po 'di lavoro, ma il tuo controller di visualizzazione è stato rilasciato (perché non è più nella gerarchia della vista o qualsiasi altra ragione). In questo caso, se non si utilizza [weak self], il controller di visualizzazione non verrà rilasciato fino a quando non si termina l'animazione perché lo si mantiene nel blocco di animazione, ma ha senso mantenerlo mantenuto fino a quando non si anima qualcosa che non è in la vista più?

Quindi, in poche parole, è don bisogno utilizzare un weak riferimento a sé quando si anima UIKit, tuttavia, non è necessario per mantenere la vostra vista mantenuto se è rilasciato, a causa un'animazione senza vista doesn' t ha senso, quindi usare weak è una buona opzione.

3

@Plabo, come detto da @Kirsteins, le animazioni e il completamento non vengono mantenuti da solo, quindi anche se si avvia un'animazione e per qualsiasi motivo il proprio controller di visualizzazione è stato rilasciato, verrà deallocato istantaneamente. Quindi, non è necessario catturare 'sé'. Si consideri l'esempio stupido sotto:

class ViewController: UIViewController { 

    @IBOutlet weak var button : UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     print("viewDidLoad ViewController") 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     UIView.animate(withDuration: 20, animations: { 
      self.button.frame = CGRect(x: 0, y: 300, width: 30, height: 30) 
     }) { finished in 
      self.button.frame = CGRect(x: 0, y: 100, width: 30, height: 30) 
     } 
    } 

    deinit { 
     print("deinit ViewController") 
    } 

} 

Non appena si rilascia, il deinitializer sarà chiamato e non verrà mai eseguito il completamento.

Problemi correlati