Могут ли блоки в стиле C вызвать утечку памяти? - PullRequest
6 голосов
/ 01 августа 2011

Я работаю над приложением слайд-шоу в стиле киоска. У меня есть UIScrollView, который показывает слайды, и фабричный класс, который генерирует слайды. Сами «слайды» являются подклассами UIViewController, которые загружаются из файлов XIB и настраиваются заводским классом. В моем главном контроллере я настроил вид прокрутки и запустил таймер. Таймер вызывает метод «перезагрузки» каждые N секунд, который обрабатывает перезагрузку и вызывает фабричный класс.

Метод, который использует класс фабрики, выглядит примерно так:

- (SlideViewController *)slideFromManagedObject:(Slide *)managedObject{

  NSInteger slideType = [managedObject slideType];

  switch(slideType){
     case kSlideTypeA:

  { 
       //
       //  configure arguments here
       //

       return [[SlideViewController alloc] initWithArgument:argument] autorelease];
         break;

  }

    //
    //  More types here...
    //

    default:
      break;
  }


}

Я еще не дошел до определения всех своих дел, но заполненные, кажется, вызывают скачки в использовании памяти . Если я добавлю return [[[UIViewController alloc] init] autorelease]; прямо перед переключателем / регистром, я не получу видимого представления, как ожидалось, но я также не вижу увеличения памяти. Я не уверен, но я подозреваю, что это "блоки C", в которые я оборачиваю свой код генерации слайдов.

Некоторые вещи на заметку:

  • Когда приложение запускается, я вижу плато памяти примерно с 400 килобайт, примерно вдвое больше. Затем, когда слайды выполняются, любой из слайдов, код генерации которых содержится в фигурных скобках, вызывается, плато памяти снова вверх.

  • Такое поведение, кажется, происходит только один раз за запуск - когда приложение проходит по всем слайдам, плато to_not_ повторяется снова. Однако , если приложение фоновое и затем перезапущено, плато возникает снова, потребляя даже больше памяти.

  • Когда я оставил приложение для работы в течение ночи, в течение примерно 10 часов и сорока минут, использование памяти медленно возросло с примерно 1,44 мегабайта до где-то ближе к 1,57 мегабайта. Я подозреваю, что есть / были некоторые другие утечки, которые, возможно, были исправлены моей настройкой, но основной скачок с 800 килобайт до 1,4-1,5 мегабайта все еще остается проблемой.

Прибор не сообщает об утечках, но плато касается меня.

Что может быть причиной увеличения памяти?

EDIT:

Так что я не думаю, что это блоки, так как использование if / else делает то же самое. Вот скриншот запущенного инструмента Allocations:

enter image description here

Где можно придерживаться этих взглядов?

1 Ответ

2 голосов
/ 10 августа 2011

Одним из возможных объяснений того, что вы видите, является некоторое кеширование, которое UIKit (я полагаю) делает с вашими объектами (не знаю, что это такое, но я в основном думаю об изображениях).

Кэширование часто используется во время переходов и для других внутренних функций UIKit.

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

Что касается отправки предупреждения памяти на устройство (в отличие от симулятора), здесь вы найдете полезную S.O. почта .

...