iOS4 - быстрое переключение контекста
Когда приложение переходит в фоновый режим работы, сколько нужно использовать грязной памяти. В видео Apple упоминается, что грязная память должна быть уменьшена настолько, насколько мы можем.
Но в моем приложении я использую контроллер навигации, чтобы выдвигать и выдвигать представления. После перемещения примерно с 20 различных страниц использование грязной памяти достигает 30 МБ или около того.
Также для "dismissModalViewControllerAnimated" и "popViewControllerAnimated" не вызывается dealloc.
У меня есть два сомнения:
- С какой грязной памятью можно жить?
- Какая альтернатива навигационного контроллера поддерживает кнопку назад?
Заранее спасибо.
2 ответа
Возможно, ваши UIViewControllers по-прежнему сохраняются, если не вызывается dealloc.
Возможно, вы устанавливаете делегаты или другие классы в этих UIViewControllers, которые сохраняют и ссылаются на резервную копию дерева (циклические ссылки).
Вы можете отладить это, перегрузив сохранение и освобождение в вашем UIViewController, а также установить точку останова и зарегистрировать retainCount.
Вот волшебный фрагмент, который я оставляю, бегая, который мне очень помогает, когда я не могу понять, почему я все еще что-то сохраняю.
- (id)retain
{
NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
return [super retain];
}
- (void)release
{
NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
[super release];
}
- (id)autorelease
{
NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
return [super autorelease];
}
__PRETTY_FUNCTION__
это специальный скрытый макрос в CLang, который дает красивое имя функции Objective C в виде массива char.
- Когда iOS начинает исчерпывать память, она пытается убить фоновые процессы, которые используют больше всего памяти. Поэтому, хотя абсолютного числа не существует, минимизировать объем используемой памяти - хорошая идея. Оставив его на 30 Мб, равносильно гарантии того, что ваше приложение будет убито
- Если вы не хотите менять свой пользовательский интерфейс, нет необходимости использовать что-либо, кроме
UINavigationController
иметь дело с вашей кнопкой назад. Я думаю, что проблема здесь в том, что еслиdealloc
не вызывать на поп или уволить, у вас утечка памяти
Почти все контроллеры представления имеют данные, которые эффективно кэшируются и могут быть восстановлены, когда приложение вернется на передний план. Подумайте о данных, которые вы выпускаете, когда вы получаете предупреждение о памяти, когда приложение работает. (Вы отвечаете на предупреждения памяти, верно?) Это тот материал, который должен быть выпущен, когда вы уходите в фоновый режим.