Вам нужно использовать -removeObserver:forKeyPath:
, чтобы удалить наблюдателя до запуска -[NSObject dealloc]
, так что да, выполнение этого в методе -dealloc
вашего класса сработает.
Лучше, чем это, хотя было бы иметь детерминированную точку, в которой независимо от того, кто владеет объектом, который выполняет наблюдение, может сказать ему, что оно сделано и (в конце концов) будет освобождено. Таким образом, вы можете немедленно прекратить наблюдение, когда объект, выполняющий наблюдение, больше не нужен, независимо от того, когда он фактически отменен.
Это важно иметь в виду, потому что время жизни объектов в Какао не так детерминировано, как некоторые думают. Сами различные фреймворки Mac OS X будут отправлять ваши объекты -retain
и -autorelease
, продлевая срок их службы за пределы того, что вы могли бы иначе представить.
Более того, когда вы перейдете к сборке мусора в Objective-C, вы обнаружите, что -finalize
будет работать в очень разное время - и в совершенно разных контекстах - чем -dealloc
. С одной стороны, финализация происходит в другом потоке, поэтому вы действительно не можете безопасно отправить -removeObserver:forKeyPath:
другому объекту методом -finalize
.
Придерживайтесь управления памятью (и другими дефицитными ресурсами) в -dealloc
и -finalize
и используйте отдельный метод -invalidate
, чтобы владелец сообщил объекту, что вы покончили с ним в детерминированной точке; делать такие вещи, как удаление наблюдений КВО там. Намерение вашего кода будет более ясным, и у вас будет меньше мелких ошибок, о которых нужно позаботиться.