Вызов метода на себя, пока в dealloc - PullRequest
7 голосов
/ 23 февраля 2011

У меня есть словарь объектов, которые нужно очистить перед их выпуском.У меня есть метод, который делает это для всего словаря.Прежде чем выпустить словарь в моем методе -dealloc, я хочу сделать то же самое.Однако я не уверен в состоянии объекта во время освобождения.Например, в C # или Java я бы никогда не вызвал метод для финализируемого объекта, но я не уверен, что это применимо к Objective C и освобождению.Допустимо ли вызывать метод очистки на self во время освобождения, или я должен дублировать эту функцию в моем -dealloc?

1 Ответ

11 голосов
/ 23 февраля 2011

Да, вы можете вызывать методы изнутри вашего dealloc метода, хотя вы должны быть осторожны.Практически only методы, которые вы должны вызывать, должны быть "разрушающими" методами или методами, которые помогают в очистке объекта перед тем, как его ресурсы будут возвращены.Вот некоторые из этих методов очистки:

  • отмена регистрации для уведомлений через центр уведомлений
  • удаление себя в качестве наблюдателя значения ключа
  • другие общие методы очистки

Обратите внимание, однако, что в каждом из этих методов ваш объект будет в несовместимом состоянии.Он может быть частично освобожден (некоторые ивы могут / будут недействительными), и поэтому вы не должны никогда полагаться на определенное состояние объекта.Эти методы должны только использоваться для продолжения деконструкции состояния объекта.

Это основная причина, почему мы не рекомендуем использовать установщики свойств (setFoo: методы) в dealloc: другоеобъект может быть зарегистрирован как наблюдатель, и использование свойства вызовет уведомление KVO, и если наблюдатель ожидает, что объект будет иметь действительное состояние, ему может не повезти, и все может взорваться очень быстро.

TL; DR:

Да, это безопасно, если вы умны.

...