Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Да, Ваш второй отрывок кода совершенно допустим.
Каждый раз-autorelease отправляется в объект, он добавляется к самому внутреннему пулу автовыпуска. Когда пул истощен, он просто отправляет - выпуск ко всем объектам в пуле.
пулы Автовыпуска являются просто удобством, которое позволяет Вам задерживать отправку - выпуск до "позже". Тот "позже" может произойти в нескольких местах, но наиболее распространенное в приложениях для GUI Какао в конце текущего цикла цикла выполнения.
, Так как функция drain
и release
, кажется, вызывает беспорядок, это может стоить разъяснить здесь (хотя это покрыто в [1 111] документация ...).
Строго говоря, с большой точки зрения изображения drain
не эквивалентны release
:
В считаемой на ссылку среде, drain
действительно выполняет те же операции как release
, таким образом, эти два в этом смысле эквивалентны. Для подчеркивания это означает, что Вы делаете не , пропускают пул, если Вы используете drain
, а не release
.
В собравшей "мусор" среде, release
нет. Таким образом это не имеет никакого эффекта. drain
, с другой стороны, содержит подсказку к коллектору, что он должен "собраться в случае необходимости". Таким образом в собравшей "мусор" среде, с помощью [1 110] помогает системе сбалансировать развертки набора.
Нет, Вы неправы. Документация четко дает понять, что под неGC, - дренаж эквивалентен - выпуск, означая, что NSAutoreleasePool будет не быть пропущенным.
Да и нет. Вы закончили бы тем, что освободили строковую память, но "пропустить" объект 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, не инстанцирует объектов, но Вы не ответственны за тех так или иначе).