Почему объект не освобождается при использовании ARC + NSZombieEnabled

Я преобразовал свое приложение в ARC и заметил, что объект, выделенный в одном из моих контроллеров представления, не освобождается при освобождении этого контроллера представления. Потребовалось время, чтобы понять почему. Во время отладки у меня включен параметр «Включить зомби-объекты» в моем проекте, и это оказалось причиной. Рассмотрим следующую логику приложения:

1) Пользователи вызывают действие в RootViewController , которое вызывает создание и представление SecondaryViewController через presentModalViewController: animated .

2) SecondaryViewController содержит ActionsController , который является подклассом NSObject .

3) ActionsController наблюдает уведомление через NSNotificationCenter при инициализации и прекращает наблюдение, когда оно освобождается.

4) Пользователь закрывает SecondaryViewController , чтобы вернуться к RootViewController .

Если параметр «Включить объекты-зомби» выключен, все вышеописанное работает нормально, все объекты освобождаются. При включении объектов-зомби на ActionsController не освобождается, даже если SecondaryViewController освобожден.

Это вызвало проблемы в моем приложении b / c NSNotificationCenter продолжает отправлять уведомления на ActionsController , и полученные обработчики вызывают сбой приложения.

Я создал простое приложение, иллюстрирующее это, на https://github.com/xjones/XJARCTestApp . Посмотрите журнал консоли с включением / выключением «Включить зомби-объекты», чтобы убедиться в этом.

ВОПРОС (S)

  1. Правильно ли это поведение Enable Zombie Objects?
  2. Как мне реализовать этот тип логики, чтобы устранить проблему. Я хотел бы продолжить использование «Включить зомби-объекты».

РЕДАКТИРОВАТЬ №1: по предложению Кевина я отправил это в Apple и openradar по адресу http://openradar.appspot.com/10537635 .

РЕДАКТИРОВАТЬ №2: пояснение к хорошему ответу

Во-первых, я опытный разработчик iOS и полностью понимаю ARC, зомби-объекты и т. Д. Если мне что-то не хватает, конечно, я ценю любое освещение.

Во-вторых, это правда, что обходной путь для этого конкретного сбоя состоит в том, чтобы удалить actionsController в качестве наблюдателя, когда secondaryViewController освобожден. Я также обнаружил, что если я явно установил actionsController = nil , когда secondaryViewController освобожден, он будет освобожден. Оба из них не являются отличным обходным путем, потому что они фактически требуют, чтобы вы использовали ARC, но код, как если бы вы не использовали ARC (например, nil iVars явно в dealloc). Конкретное решение также не помогает определить, когда это будет проблемой в других контроллерах, поэтому разработчики детерминированно знают, когда и как решить эту проблему.

Хороший ответ объяснил бы, как детерминированно узнать, что вам нужно сделать что-то особенное с объектом при использовании ARC + NSZombieEnabled, чтобы он разрешил этот конкретный пример, а также применился в целом к ​​проекту в целом, не оставляя возможности для других подобных проблем.

Вполне возможно, что хорошего ответа не существует, поскольку это может быть ошибка в XCode.

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

35
задан XJones 7 December 2011 в 16:49
поделиться