Когда мне следует освободить объект [[UIApplication sharedApplication] делегат]? - PullRequest
0 голосов
/ 10 сентября 2011

В своем приложении я много раз использую следующий код (особенно для управления NavigationController):

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

Когда мне его выпустить?

Спасибо за помощь*

Стефан

Ответы [ 2 ]

7 голосов
/ 10 сентября 2011

Не. Никогда не освобождает делегата приложения - оно автоматически управляется ОС.

Если вы заглянете в файл main.m вашего приложения, вы увидите некоторый код, который инициализирует экземпляр UIApplication, представляющий ваше приложение - это его ответственность за управление жизненным циклом делегата приложения, а не ваша ответственность.

РЕДАКТИРОВАТЬ , как указывает @Goz, вы должны release это, если в какой-то момент вы retain это. Однако, поскольку объект приложения (и, следовательно, по расширению его делегат) гарантированно останется в области действия приложения в течение всего жизненного цикла приложения (, если только вы не возитесь с ним), гораздо лучше просто не управляет памятью делегата, так как это исключает возможность случайного перезаряда или других связанных с этим проблем.

0 голосов
/ 10 сентября 2011

Краткий ответ: никогда не выпускайте делегата приложения.

Пояснение:
Мне часто помогает решить проблемы с mem-mgmt, когда я проверяю, как все объявлено. Посмотрите, как объявлено свойство delegate для UIApplication:

@property(nonatomic,assign) id<UIApplicationDelegate> delegate;

Как видите, это назначенное свойство , означающее, что все mem-mgmt, выполняемое здесь, просто назначает указатели для переменной экземпляра. Это означает, что вызов release для вашего делегата приложения приведет к выполнению метода -dealloc для вашего MyAppDelegate. Перейдите и попробуйте это в отладчике, и вы увидите, что ваше приложение получит EXC_BAD_ACCESS - то есть, оно потерпит крах.

РЕДАКТИРОВАТЬ: Однако, как предполагает Гоз, вы можете позвонить retain, а затем release. Но, во-первых, не имеет смысла делать это retain/release с делегатом приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...