2011-09-19 4 views
10

Sto giocando con il kit di mappe e ho creato un'annotazione. Sto cercando di trovare il mio errore a causa di questo errore:Impostazione punto di interruzione a NSKVODeallocateBreak

An instance 0x1b7ac0 of class AddressAnnotation 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:

non sono sicuro dove che NSKVODeallocateBreak per impostare un punto di interruzione è. Ho pensato che avrei potuto usare gli strumenti per eseguirne il debug, ma quando provo, si blocca senza indicarmi dove si è bloccato. qualche idea?

risposta

16

Probabilmente si sta facendo qualcosa di simile nel codice:

[addressAnnotation addObserver:self forKeyPath:kSelectedAnnotationObserverKeyPath options:NSKeyValueObservingOptionNew context:@"selectedOrDeselected"];

Ciò significa che si sta registrando un osservatore per scoprire quando è stata selezionata un'annotazione.

È necessario rimuovere l'osservatore quando l'annotazione viene rimosso dalla mappa, in questo modo:

[addressAnnotation removeObserver:self forKeyPath:kSelectedAnnotationObserverKeyPath];

Questo dovrebbe rimuovere l'errore. In caso contrario e si desidera eseguire il debug, è necessario impostare un punto di interruzione su NSKVODeallocateBreak. Per fare ciò, apri il menu Run, Manage Breakpoints, Add symbolic breakpoint, inserisci NSKVODeallocateBreak ed eccoti.

Spero che aiuti!

+0

In realtà sto solo aggiungendo un'annotazione che è un ivar. Quando provo a spostarlo dopo un paio di volte, ottengo quell'errore. Aggiungendo un pin (annotazione al mapView), sto implicitamente aggiungendo un osservatore? Grazie. – Crystal

+6

Per impostare il punto di interruzione simbolico in Xcode 4, passare a Navigatore punti di interruzione e fare clic sul piccolo pulsante più in basso. (via https://devforums.apple.com/thread/68421) – Palimondo

5

Per impostare un punto di interruzione qui con LLDB, avviare la vostra applicazione, quindi metterlo in pausa, e al LLDB prompt di debug di scrittura:

breakpoint set --name NSKVODeallocateBreak 

Ora hai un punto di interruzione impostato lì. Spero che questo dovrebbe aiutarti a trovare il problema, che probabilmente sarà del tipo descritto da @frowing

+0

c'è un modo per settarlo altrove senza doverlo digitare ogni volta nel prompt di debug di LLDB? – Hlung