Должен ли авто-релиз вызывать сбой, если nsautoreleasepool не объявлен? - PullRequest
3 голосов
/ 09 января 2012

Извините, я новичок в программировании какао, и я не уверен, действительно ли я понимаю, как работает nsautoreleasepool.

Везде, где я читаю, что-то говорится о NSAutoreleasePool, отвечающем за все вызовы авто-выпуска (говоря опоследний объявленный NSAutoreleasePool).

Учитывая следующий код:

int main(int argc, char *argv[]) {

    //NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    //[pool release];
    return retVal;
}

в какой-то момент моего приложения у меня также было бы что-то близкое к этому:

NSString* b = [[NSString alloc] initWithFormat:@"%d", 10];
[b autorelease];

Учитываячто у меня NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; нигде нет ... разве [b autorelease]; не приводит к сбою приложения?Но приложение, кажется, работает нормально.

Замечание: я не собираюсь писать приложение без NSAutoreleasePool, я просто хочу получить представление о том, как это работает.Этот факт заставил усомниться в том, что я думал, что знал.

Ответы [ 4 ]

3 голосов
/ 09 января 2012

В консоли вы просто получите предупреждение о том, что нет пула автоматического выпуска и что объект утек.

Если вы действительно хотите понять пулы авто-релиза, прочитайте Mike Ash's Давайте создадим NSAutoreleasePool .

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

Из документации для NSAutoreleasePool ...

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

Это довольно очевидно.Вы получаете какие-либо сообщения, связанные с этим, вошли в консоль?

0 голосов
/ 09 августа 2018

UIApplicationMain() гарантирует, что основной поток запускает цикл обработки событий, поэтому ваше приложение может обрабатывать события (например, пользовательский ввод, события таймера и т. Д.), А цикл обработки событий создает автозапуск перед началом своей итерации и освобождает его по завершении. с этим Весь код, который вызывается из четного цикла основного потока (например, весь код пользовательского интерфейса), всегда имеет автозапуск, и вам ничего не нужно делать. Вам нужно управлять автозапуском только при использовании потока, отличного от основного потока (но только при фактическом использовании потока! При использовании DispatchQueues или OperationQueues они также будут управлять автозапуском для вас), а в некоторых редких случаях вы хотите использовать их вокруг циклов, чтобы сохранить небольшой объем памяти (автозапуск собирает объекты для последующего выпуска, но иногда вы не хотите, чтобы он собирал слишком много объектов и, следовательно, становился слишком большим, вместо этого вы хотите очищать его на каждой итерации вашего собственного цикла, в в этом случае вам нужно будет самому управлять). В большинстве случаев вам не нужно ничего знать об autoreleasepools, вы можете написать целое приложение с полным набором функций, но каждый не слышал об autoreleasepools. Вам нужно только знать, когда вы должны вызывать autorelease для принадлежащего вам объекта, и это относится только к не-ARC-коду, поскольку с ARC компилятор решит это для вас автоматически.

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

Непосредственно из яблочной документации :

класс NSApplication устанавливает пулы автоматического выпуска (экземпляры класса NSAutoreleasePool) во время инициализации и внутри цикла событий, в частности, в рамках его инициализации(или sharedApplication) и запустить методы.Точно так же методы, которые Набор Приложения добавляет к NSBundle, используют пулы автоматического выпуска во время загрузки файлов пера.Эти пулы автоматического выпуска недоступны вне области применения соответствующих методов NSApplication и NSBundle.Как правило, приложение создает объекты либо во время работы цикла обработки событий, либо путем загрузки объектов из nib-файлов, поэтому это отсутствие доступа обычно не является проблемой.Однако, если вам нужно использовать классы Какао внутри самой функции main () (кроме как для загрузки nib-файлов или создания экземпляра NSApplication), вы должны создать пул автоматического выпуска перед использованием классов, а затем освободить пул, когда вы закончите.,Для получения дополнительной информации см. NSAutoreleasePool в справочнике Framework Foundation .

...