2010-07-06 2 views
6

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

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

Также на «rejectModalViewControllerAnimated» и «popViewControllerAnimated» dealloc не вызывается.

Я два сомнения:

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

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

+0

1. Не 30 МБ. Старые устройства iOS имеют только 128 МБ памяти, поэтому ваше приложение будет заполнять это примерно на 23% ... 2. Если вы действительно просачиваетесь на 30 МБ, вы, вероятно, ничего не выпускаете, где-то это не 'UINavigationController' ' сбой. –

+0

Hi Douwe, Спасибо, что ответили. Почему я сомневаюсь в UINavigationController, потому что я продолжаю толкать в нем контроллеры представлений.И когда я выхожу из контллеров представления из контроллера навигации, метод dealloc не вызывается, где я освобождаю переменные экземпляра. И память не очищается, используемая всеми этими переменными экземпляра. Я делаю что-то неправильно? Должен ли я очищать переменные экземпляра где-то еще, а не в dealloc? – Sunil

+0

Есть ли у вас какие-либо другие ссылки на контроллеры вашего вида, в другом месте вашего приложения? Если вы выскочите их, но все еще имеете ссылку в другом месте контроллера, он не получит GCed – blueberryfields

ответ

4

Возможно, у вас все еще есть UIViewControllers, если dealloc не вызывается.

Возможно, вы устанавливаете делегаты или другие классы в этих UIViewControllers, которые сохраняются и ссылаются на резервное копирование дерева (круговые ссылки).

Способ, которым вы можете отлаживать это, - это перегрузить сохранение и освобождение в вашем UIViewController и установить точку останова и занести в журнал keepCount.

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

- (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__ это специальный скрытый макрос в лязг, который дает довольно Objective-C имя функции как массив символов.

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

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