В Какао я должен удалить Объект из получения уведомлений KVO при освобождении его?

Функция готовности в jQuery делает несколько вещей. Честно говоря, я не вижу, чтобы это заменило его, если у вас не было удивительно небольшой выход с вашего сайта. jQuery - довольно маленькая библиотека, и она обрабатывает всевозможные кросс-браузерные вещи, которые вам понадобятся позже.

В любом случае, здесь мало смысла публиковать его, просто откройте jQuery и посмотрите по методу bindReady.

Он начинается с вызова либо document.addEventListener("DOMContentLoaded"), либо document.attachEvent('onreadystatechange') в зависимости от модели события и продолжается оттуда.

23
задан Tieme 11 September 2012 в 14:07
поделиться

3 ответа

Необходимо использовать -removeObserver:forKeyPath: для удаления наблюдателя прежде -[NSObject dealloc] выполнения, таким образом, да, делая его в -dealloc метод класса работал бы.

Лучше, чем что, хотя должен был бы иметь детерминированную точку, где то независимо от того, что владеет объектом, это делает наблюдение, могло сказать ему, что оно сделано и будет (в конечном счете) освобождено. Тем путем можно прекратить наблюдать сразу, когда вещь, делающая наблюдение, больше не необходима, независимо от того, когда это на самом деле освобождено.

Это важно для учета, потому что время жизни объектов в Какао не так детерминировано, как некоторые люди, кажется, думают, что это. Сами различные платформы Mac OS X будут отправлять Ваши объекты -retain и -autorelease, расширяя их время жизни вне того, что Вы могли бы иначе думать, что это будет.

, Кроме того, при создании перехода к сборке "мусора" Objective C Вы найдете, что -finalize будет работать в совсем другие времена —, и в совсем других контекстах —, чем -dealloc сделал. С одной стороны, завершение происходит на различном потоке, таким образом, Вы действительно не можете безопасно отправлять -removeObserver:forKeyPath: к другому объекту в -finalize метод.

Придерживаются памяти (и другой дефицитный ресурс) управление в -dealloc и -finalize и используют отдельное -invalidate метод, чтобы сделать, чтобы владелец сказал объекту, что Вы сделаны с ним в детерминированной точке; сделайте вещи как удаление наблюдений KVO там. Намерение Вашего кода будет более ясным, и у Вас будет меньше тонких ошибок для заботы о.

38
ответ дан Chris Hanson 29 November 2019 в 01:49
поделиться

Немного дополнительной информации, которую я получил по болезненному опыту: хотя использование NSNotificationCenter, обнуляющее слабые ссылки при выполнении при сборке "мусора", KVO не делает. Таким образом можно сойти с рук не удаление наблюдателя NSNotificationCenter при использовании GC (когда использование сохраняет/выпускает, все еще необходимо удалить наблюдателя), но необходимо все еще удалить наблюдателей KVO, как Chris описывает.

5
ответ дан Barry Wark 29 November 2019 в 01:49
поделиться

Определенно согласитесь с Chris на, "Придерживаются памяти (и другой дефицитный ресурс), управление в-dealloc и - завершает..." комментарий. Много времен я буду видеть, что люди пытаются делать недействительным объекты NSTimer в своих функциях dealloc. Проблема, NSTimer сохраняет, это - цели. Так, если, целью которого NSTimer сам, dealloc никогда не будет получать названное приведение к некоторым потенциально противным утечкам памяти.

Делают недействительным в -invalidate и делают другую очистку памяти в Вашем dealloc и finalize.

2
ответ дан 29 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: