Удаление Обозревателя в Dealloc - PullRequest
3 голосов
/ 07 октября 2011

решено - получается, что передача nil в removeObserver:forKeyPath: не удалась, но ТОЛЬКО в ручном управлении памятью. Он отлично работает в режиме сбора мусора. В документации Apple НЕ сказано, что для нее требуется значение, отличное от nil, поэтому я предполагаю, что это ошибка.

У меня есть объект, который добавляет себя в качестве наблюдателя, через [self addObserver:self forKeyPath: и т. Д. В моем методе -dealloc (обратите внимание, что я использую счетчики сохранения, а НЕ сборщик мусора) я вызываю [self removeObserver:self forKeyPath:nil];, который должен работать. Однако я получаю следующую ошибку:

Cannot remove an observer <Snapshot 0x10047a6d0> for the key path "(null)" from <Snapshot 0x10047a6d0> because it is not registered as an observer.

Теперь, если я удаляю эту строку, чтобы она не удалялась сама, я получаю это сообщение:

An instance 0x100193580 of class Snapshot 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 0x1001be2f0> (
<NSKeyValueObservance 0x1001a0a00: Observer: 0x100193580, Key path: fileURL, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x1001a02f0>
)

Итак ... объект наблюдает за собой ... и все же это не так? : D Обратите внимание, что во втором сообщении наблюдатель имеет тот же адрес, что и освобождаемый экземпляр, так что это действительно тот же объект.

Строка [self removeObserver:self forKeyPath:nil]; работала раньше, когда она была собрана сборщиком мусора при вызове из -finalize, но не теперь из -dealloc в коде, управляемом вручную.

Есть мысли?

1 Ответ

9 голосов
/ 07 октября 2011

Должен ли путь ключа действительно быть nil?из документации Apple:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html

Путь к ключу относительно объекта наблюдения для наблюдения.Это значение не должно быть ноль.

...