Я преобразовал свое приложение в ARC и заметил, что объект, размещенный в одном из моих контроллеров представления, не освобождается, когда этот контроллер представления освобождается. Потребовалось время, чтобы понять, почему. Я включил «Включить объекты зомби» для своего проекта во время отладки, и это оказалось причиной. Рассмотрим следующую логику приложения:
1) Пользователи вызывают действие в RootViewController
, которое приводит к созданию SecondaryViewController
и представлению через presentModalViewController:animated
.
2) SecondaryViewController
содержит ActionsController
, который является подклассом NSObject
.
3) ActionsController
наблюдает за уведомлением через NSNotificationCenter
, когда оно инициализируется, и прекращает наблюдение, когда оно освобождается.
4) Пользователь закрывает SecondaryViewController
, чтобы вернуться к RootViewController
.
При выключенном параметре «Включить объекты-зомби» описанное выше работает нормально, все объекты освобождаются. При включении объектов-зомби на ActionsController
не освобождается, даже если SecondaryViewController
освобождается.
Это вызвало проблемы в моем приложении, потому что NSNotificationCenter
продолжает отправлять уведомления ActionsController
, и результирующие обработчики вызывают сбой приложения.
Я создал простое приложение, иллюстрирующее это, по адресу https://github.com/xjones/XJARCTestApp. Посмотрите в журнале консоли включение/выключение объектов-зомби, чтобы убедиться в этом.
ВОПРОС(Ы)
- Это правильное поведение 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.
Спасибо всем!
.DS_Store
к вашему глобальному игнорированию git. - person Jim   schedule 07.12.2011