Почему объект не освобождается при использовании 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.

Спасибо всем!

Ответы на вопрос(5)

Ваш ответ на вопрос