Как NSAutoreleasePool автовыпускает работу пула?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

95
задан 15 revs, 9 users 100% 6 June 2016 в 19:18
поделиться

4 ответа

Да, Ваш второй отрывок кода совершенно допустим.

Каждый раз-autorelease отправляется в объект, он добавляется к самому внутреннему пулу автовыпуска. Когда пул истощен, он просто отправляет - выпуск ко всем объектам в пуле.

пулы Автовыпуска являются просто удобством, которое позволяет Вам задерживать отправку - выпуск до "позже". Тот "позже" может произойти в нескольких местах, но наиболее распространенное в приложениях для GUI Какао в конце текущего цикла цикла выполнения.

67
ответ дан chakrit 24 November 2019 в 05:53
поделиться

Нет, Вы неправы. Документация четко дает понять, что под неGC, - дренаж эквивалентен - выпуск, означая, что NSAutoreleasePool будет не быть пропущенным.

7
ответ дан kperryua 24 November 2019 в 05:53
поделиться

Да и нет. Вы закончили бы тем, что освободили строковую память, но "пропустить" объект NSAutoreleasePool в память при помощи дренажа вместо выпуска при выполнении этого под собравшим "мусор" (не управляемая память) среда. Эта "утечка" просто делает экземпляр NSAutoreleasePool "недостижимым" как любой другой объект без сильных указателей под GC, и объект был бы очищен в следующий раз выполнения GC, которые могли очень хорошо быть непосредственно после вызова к -drain:

дренаж

В собравшей "мусор" среде, триггерная сборка "мусора", если память выделила начиная с последнего набора, больше, чем текущий порог; иначе ведет себя как выпуск.... В собравшей "мусор" среде этот метод в конечном счете звонит objc_collect_if_needed.

Иначе, это подобно тому, как -release ведет себя под неGC, да. Как другие заявили, -release не под GC, таким образом, единственный способ удостовериться пул функционирует правильно под GC, до -drain, и -drain при работах неGC точно как -release под неGC, и возможно передает его функциональность более ясно также.

я должен указать, что Ваш оператор "что-либо позвонившее с новым, выделением или init" не должен включать "init" (но должен включать "копию"), потому что "init" не выделяет память, это только настраивает объект (вид конструктора). При получении объекта alloc'd и функции, только вызванной init как таковой Вы не выпустили бы ее:

- (void)func:(NSObject*)allocd_but_not_init
{
    [allocd_but_not_init init];
}

, Который больше не использует память, чем он, Вы уже запустили с (принимающий init, не инстанцирует объектов, но Вы не ответственны за тех так или иначе).

-2
ответ дан matthias 24 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: