2017-10-21 12 views
1

Je crée une variable locale dans une fonction awakeFromNib, l'utilise dans un bloc d'animation UIView, mais elle n'est jamais publiée, pourquoi?Swift, pourquoi cette var locale n'est pas libérée?

Voici le code (à l'intérieur awakeFromNib dans un UITableViewCell)

var fullPhotoDisposeBag = DisposeBag() 
fullScreenImageView.rx.tapGesture().when(UIGestureRecognizerState.recognized).subscribe(onNext: { (tap) in 

     UIView.animate(withDuration: 0.15, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: { 
      fullScreenImageView.frame = oldFullScreenFrame 
     }, completion: { (finished) in 
      fullScreenImageView.removeFromSuperview() 
      let _ = fullPhotoDisposeBag //This line avoid early release, but retains too much... 
     }) 
}, onDisposed:{ 
     print("disposed") 
}).addDisposableTo(fullPhotoDisposeBag) 

Un indice est que le tableView est à la racine d'un onglet de mon application, de sorte que le UITableView est jamais désallouée ainsi le UITableViewCell est jamais désaffecté en raison de la réutilisabilité. Mais pourquoi ARC garderait-elle cette variable? Utilisé uniquement dans une fonction et un bloc d'achèvement?

PS: J'utilise actuellement une option DisposeBag que je mets à zéro dans le bloc d'achèvement, mais je ne comprends pas pourquoi je dois le faire ...

Répondre

1

On dirait un cycle retenir. Ma conjecture est que le garbage collector ne libèrera pas la variable locale jusqu'à ce que la fermeture d'achèvement cesse de la référencer, et la fermeture d'achèvement n'est jamais libérée parce qu'elle est la propriété de votre fonction locale. Mon conseil serait de déplacer ce code de votre UIView à votre UIViewController, puisque c'est là que ce genre de comportement devrait être défini.

+0

Merci, c'est ce que je pensais. Je vais déplacer le code vers viewController, malheureusement je suppose qu'il n'y a pas d'autre moyen avec rxSwift que de déclarer le dispagel optionnel, forcer le déballage lors de l'ajout à dispagBag (je déteste utiliser "!") Puis paramétrer le disposBag à zéro lorsque l'animation est terminée – Devous

+0

Que faire de 'fullPhotoDisposeBag = DisposeBag()' dans le bloc d'achèvement? Cela devrait suffire à vider le 'DisposeBag' d'origine, en cassant le cycle de conservation, sans vous obliger à introduire un' Optional'. –