J'ai une vue (nous l'appellerons vue A) qui a une weak
à sa vue supérieure (vue B). La vue A envoie un KVO à sa vue supérieure, la vue B. Puisque la référence de la vue A à la vue B est une propriété faible (pour éviter un cycle de retenue), comment puis-je supprimer l'observateur (A observant B) ? La référence de la vue A à la vue B est réduite à néant avant que j'aie la possibilité de la supprimer.
A survit à B puisque le contrôleur de vue a une référence forte à A. Voici le message du journal des fuites :
An instance 0x9ac5200 of class UITableView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x8660360> (
<NSKeyValueObservance 0x8660320: Observer: 0x8660020, Key path: contentOffset, Options: <New: YES, Old: NO, Prior: NO> Context: 0x8660020, Property: 0x864ac80>
)
B est un UITableView. En plaçant un point d'arrêt à NSKVODeallocateBreak
donne des résultats inutiles.
En A removeFromSuperview
J'essaie de supprimer l'observateur mais la référence de A à B est déjà nil
.
Passage à unsafe_unretained
et faire les choses plus manuellement ou appeler [A removeFromSuperview]
dans le contrôleur de vue dealloc
résout le problème. J'aimerais savoir comment résoudre ce problème à l'aide d'une weak
propriété cependant.
Voici le code correspondant : https://gist.github.com/2822776