iOS4 - быстрое переключение контекста

Когда приложение переходит в фоновый режим работы, сколько нужно использовать грязной памяти. В видео Apple упоминается, что грязная память должна быть уменьшена настолько, насколько мы можем.

Но в моем приложении я использую контроллер навигации, чтобы выдвигать и выдвигать представления. После перемещения примерно с 20 различных страниц использование грязной памяти достигает 30 МБ или около того.

Также для "dismissModalViewControllerAnimated" и "popViewControllerAnimated" не вызывается dealloc.

У меня есть два сомнения:

  1. С какой грязной памятью можно жить?
  2. Какая альтернатива навигационного контроллера поддерживает кнопку назад?

Заранее спасибо.

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.

  1. Когда iOS начинает исчерпывать память, она пытается убить фоновые процессы, которые используют больше всего памяти. Поэтому, хотя абсолютного числа не существует, минимизировать объем используемой памяти - хорошая идея. Оставив его на 30 Мб, равносильно гарантии того, что ваше приложение будет убито
  2. Если вы не хотите менять свой пользовательский интерфейс, нет необходимости использовать что-либо, кроме UINavigationController иметь дело с вашей кнопкой назад. Я думаю, что проблема здесь в том, что если dealloc не вызывать на поп или уволить, у вас утечка памяти

Почти все контроллеры представления имеют данные, которые эффективно кэшируются и могут быть восстановлены, когда приложение вернется на передний план. Подумайте о данных, которые вы выпускаете, когда вы получаете предупреждение о памяти, когда приложение работает. (Вы отвечаете на предупреждения памяти, верно?) Это тот материал, который должен быть выпущен, когда вы уходите в фоновый режим.

Другие вопросы по тегам