Ho una vista (chiameremo questa vista A) che ha una proprietà weak
alla sua superview (vista B). Visualizza A KVO's its superview, vedi B. Poiché il riferimento della vista A alla vista B è una proprietà debole (per impedire un ciclo di conservazione), come posso rimuovere l'osservatore (A osservando B)? Vedi il riferimento di A per vedere che B si spegne prima che io abbia la possibilità di rimuoverlo.Come si rimuove KVO da una proprietà debole?
A sopravvive B dal momento che il controller di vista ha un forte riferimento alla A. è il messaggio di log che perde Qui:
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 è un UITableView. L'impostazione di un punto di interruzione su NSKVODeallocateBreak
produce risultati inutili.
In A's removeFromSuperview
, provo a rimuovere l'osservatore ma il riferimento di A a B è già nil
.
Passare a unsafe_unretained
e fare le cose più manualmente o chiamando [A removeFromSuperview]
nel controller della vista dealloc
risolve il problema. Mi piacerebbe sapere come risolvere questo utilizzando una proprietà weak
però.
Ecco il codice rilevante: https://gist.github.com/2822776
Il mio male ... +1 comunque. – CodaFi