Правильный способ использования @autoreleasepools? - PullRequest
4 голосов
/ 31 января 2012

Я хотел бы знать, является ли следующий код хорошим способом использования нового @autoreleasepool, должен ли я использовать его таким образом или позволить основному автозапуску позаботиться об объектах?

  • (void), вызывающийAutoReleasedObject, вероятно, будет моим viewDidAppear или подобной функцией.

Спасибо!

- (UIBarButtonItem*)backButton {
    UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"CustomBackTitle"
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:nil
                                                                  action:nil];
    return [backButton autorelease];
}

- (void) callingAutoReleasedObject {

    @autoreleasepool {
        [[self navigationItem] setBackBarButtonItem:[self backButton]];
    }
}

Ответы [ 4 ]

8 голосов
/ 31 января 2012

Из справочника Apple :

Однако есть три случая, когда вы можете использовать собственные пулы автоматического выпуска:

  • Если вы пишете программу, которая не основана на структуре пользовательского интерфейса, например, инструмент командной строки.

  • Если вы пишете цикл, который создает много временных объектов.Вы можете создать пул автоматического выпуска в цикле, чтобы избавиться от этих объектов перед следующей итерацией.Использование пула автоматического выпуска в цикле помогает уменьшить максимальный объем памяти приложения.

  • Если вы создаете вторичный поток.Вы должны создать свой собственный пул автоматического выпуска, как только поток начнет выполняться;в противном случае ваше приложение будет пропускать объекты.(Подробнее см. В разделе «Пулы и потоки автоматического освобождения».)

Лично я создал несколько блоков @autoreleasepool, чтобы избежать утечек памяти в ТЯЖЕЛОМ, во время фоновой синхронизации с использованием Core Data, посколькуфреймворк (который я люблю) создает ОГРОМНОЕ количество автоматически выпущенных объектов, которые ДОЛЖНЫ быть использованы для сохранения доступной памяти;)

2 голосов
/ 31 января 2012

Еще одна причина для создания авто-релиза - если вы находитесь в цикле, который создает много автоматически выпущенных объектов.

1 голос
/ 31 января 2012

Обычно вы создаете пул автоматического выпуска, когда:

  • ваша программа запускается
  • Вы начинаете новую тему
  • вы получаете обратный вызов от интерфейса C или C ++, и вы не знаете, когда вызывающий установил для вас пул
  • когда вы создаете много автоматически выпущенных объектов. Действительно, это должно быть более распространенным явлением, чем многие люди используют их. Они достаточно легки для создания.
  • когда данные / ивары автоматически выпущенных объектов велики и могут быть освобождены досрочно при наличии пула. например, объект objc, который содержит данные пикселей или аудиоданные.
  • при отладке смещения подсчета ссылок.

Для чего-то такого простого, как ваш пример, не беспокойтесь.

0 голосов
/ 31 января 2012

Единственная причина, по которой вам нужно определить собственный пул автоматического выпуска, - это если вы также создаете свои собственные потоки.

Для того, что вы делаете выше, обязательно используйте основной пул автоматического выпуска.

...