Почему объект не освобождается при использовании ARC + NSZombieEnabled
Я преобразовал свое приложение в ARC и заметил, что объект, размещенный в одном из моих контроллеров представления, не освобождается, когда тот контроллер представления был освобожден. Потребовалось время, чтобы понять, почему. Я включил Включить объекты-зомби для своего проекта во время отладки, и это оказалось причиной. Рассмотрим следующую логику приложения:
1) Пользователи вызывают действие вRootViewController
это вызываетSecondaryViewController
быть созданным и представленным черезpresentModalViewController:animated
.
2)SecondaryViewController
содержитActionsController
этоNSObject
подкласс.
3)ActionsController
отмечает уведомление черезNSNotificationCenter
когда он инициализируется и перестает наблюдать, когда он освобождается.
4) Пользователь отклоняетSecondaryViewController
вернуться вRootViewController
.
С выключенным Enable Zombie Objects все вышеперечисленное работает нормально, все объекты освобождаются. С включенными объектами зомби наActionsController
не освобождается, даже еслиSecondaryViewController
освобожден.
Это вызвало проблемы в моем приложении б / кNSNotificationCenter
продолжает отправлять уведомленияActionsController
и получающиеся обработчики вызывают сбой приложения.
Я создал простое приложение, иллюстрирующее это наhttps://github.com/xjones/XJARCTestApp, Посмотрите журнал консоли с включенным / выключенным параметром «Включить объекты-зомби», чтобы убедиться в этом.
ВОПРОСОВ)
Это правильное поведение Enable Zombie Objects?Как я должен реализовать этот тип логики, чтобы устранить проблему. Я хотел бы продолжить использование Enable Zombie Objects.РЕДАКТИРОВАТЬ # 1: в соответствии с предложением Кевина я отправил это в Apple и openradar вhttp://openradar.appspot.com/10537635.
РЕДАКТИРОВАТЬ № 2: разъяснение о хорошем ответе
Во-первых, я опытный разработчик iOS и хорошо понимаю ARC, объекты-зомби и т. Д. Если я что-то упускаю, конечно, я ценю любое освещение.
Во-вторых, это правда, что обходной путь для этого конкретного сбоя заключается в удаленииactionsController
в качестве наблюдателя, когдаsecondaryViewController
освобожден. Я также обнаружил, что если я явно установитьactionsController = nil
когдаsecondaryViewController
будет освобожден, он будет освобожден. Оба они не являются хорошим обходным путем, поскольку они фактически требуют, чтобы вы использовали ARC, а кодировали, как если бы вы не использовали ARC (например, nil iVars явно в dealloc). Конкретное решение также не помогает определить, когда это станет проблемой в других контроллерах, поэтому разработчики точно знают, когда и как обойти эту проблему.
Хороший ответ объяснил бы, как детерминистически знать, что вам нужно сделать что-то особенное с объектом при использовании ARC + NSZombieEnabled, чтобы это решило этот конкретный пример, а также применимо в целом к проекту в целом, оставляя потенциал для других подобных проблемы.
Вполне возможно, что хорошего ответа не существует, так как это может быть ошибкой в XCode.
Спасибо всем!