Установка точки останова в NSKVODeallocateBreak

Я играю с набором карт и создал аннотацию. Я пытаюсь найти свою ошибку из-за этой ошибки:

Экземпляр 0x1b7ac0 класса AddressAnnotation был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы с ним. Информация о наблюдениях просочилась и даже может быть ошибочно привязана к какому-то другому объекту. Установите точку останова на NSKVODeallocateBreak, чтобы остановиться здесь в отладчике. Вот текущая информация о наблюдении:

Я не уверен, где находится этот NSKVODeallocateBreak для установки точки останова. Я думал, что смогу использовать инструменты для его отладки, но когда я пытаюсь, он падает, не давая мне никаких указаний, где он упал. Есть предположения?


person Crystal    schedule 19.09.2011    source источник


Ответы (2)


Вероятно, вы делаете что-то подобное в своем коде:

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

Это означает, что вы регистрируете наблюдателя, чтобы узнать, когда была выбрана аннотация.

Вы должны удалить наблюдателя, когда аннотация будет удалена с карты, например:

[addressAnnotation removeObserver:self forKeyPath:kSelectedAnnotationObserverKeyPath];

Это должно убрать ошибку. Если это не так, и вы хотите отладить его, вам, безусловно, следует установить точку останова на NSKVODeallocateBreak. Для этого открываем меню Run, Manage Breakpoints, Add symbolic breakpoint, вводим NSKVODeallocateBreak и готово.

Надеюсь, поможет!

person Fran Sevillano    schedule 19.09.2011
comment
На самом деле я просто добавляю аннотацию, которая является иваром. Когда я пытаюсь переместить его через пару раз, я получаю эту ошибку. Добавляя булавку (аннотацию к mapView), я неявно добавляю наблюдателя? Спасибо. - person Crystal; 20.09.2011
comment
Чтобы установить символическую точку останова в Xcode 4, переключитесь на навигатор точек останова и нажмите маленькую кнопку с плюсом внизу. (через devforums.apple.com/thread/68421) - person Palimondo; 29.05.2012

Чтобы установить здесь точку останова с помощью LLDB, запустите приложение, затем приостановите его и в приглашении отладки LLDB напишите:

breakpoint set --name NSKVODeallocateBreak

Теперь у вас есть точка останова. Надеюсь, это поможет вам найти проблему, которая, вероятно, будет похожа на описанную @frowing.

person niklassaers    schedule 14.10.2013
comment
есть ли способ установить это в другом месте без необходимости каждый раз вводить это в приглашении отладки LLDB? - person Hlung; 05.02.2014