NSObject
содержит аккуратную функцию с именем autorelease
. Это означает, что все объекты в Objective-C содержат эту функцию.
Эта функция вставляет self
в пул автоматического выпуска, задерживая вызов функции release
объекта до тех пор, пока пул автоматического выпуска не будет освобожден. Большинство внутренних API-интерфейсов используют пул автоматического выпуска, и кроме того, который расположен в main()
, в каждом проходе есть один выделенный и освобожденный в основном цикле UIKit.
Короче говоря: это очередь для отложенного уменьшения счетчика ссылок.
Пример того, где скрыт автоматический выпуск:
[NSString stringWithUTF8String:"some string"];
Этот объект выделен, и для него вызывается авто-релиз. Как бы вы использовали это сами?
MyObject *obj = [[[MyClass alloc] init] autorelease];
Почему это хорошо? Когда вы возвращаете этот объект, вызывающей функции не нужно заботиться о том, чтобы освободить этот объект, и при желании он может сохранить его (но не обязан).
Чтобы расширить и уточнить четыре года спустя:
В то время как UIKit и AppKit создают и истощают NSAutoreleasePool
во время их основного цикла выполнения, в вашей программе без графического интерфейса вам нужно создать его самостоятельно. Различный код ожидает наличия NSAutoreleasePool
подарка, и, поскольку вы не инициализировали структуру GUI и не использовали ее, нет кода, который волшебным образом создаст его для вас.
В то время как NSLog()
и константа NSString
в вашем примере не требуют пула, даже тривиальный [NSMutableArray array]
требует, учитывая, что он действительно может интерпретироваться как [[[NSMutableArray alloc] init] autorelease]
.