NSObject
zawiera funkcję o nazwie autorelease
schludny. Oznacza to, że wszystkie obiekty w Objective-C zawierają tę funkcję. Ta funkcja wstawia self
do puli autorelease, opóźniając wywołanie funkcji obiektu release
, dopóki pula autorelease nie zostanie zwolniona. Większość wewnętrznych API korzysta z puli autorelease, a obok tego, który znajduje się w main()
, w każdym przejściu jest jeden przydzielony i zwolniony w głównej pętli UIKit.
W skrócie: jest to kolejka opóźnionego zmniejszenia licznika referencyjnego.
Przykład gdzie autorelease jest ukryta:
[NSString stringWithUTF8String:"some string"];
Ten obiekt jest przydzielona i autorelease nazywa się na nim. Jak wykorzystasz to sam?
MyObject *obj = [[[MyClass alloc] init] autorelease];
Dlaczego to jest dobre? Po zwróceniu tego obiektu funkcja wywołująca nie musi dbać o zwolnienie tego obiektu i opcjonalnie może go zachować (ale nie musi).
Aby rozwinąć i wyjaśnić cztery lata później:
Podczas UIKit i zestaw klas AppKit tworzyć i spuścić się NSAutoreleasePool
trakcie ich głównym runloop, w programie non-GUI trzeba go utworzyć samodzielnie. Różne kody oczekują, że będą obecne w postaci NSAutoreleasePool
, a ponieważ nie zainicjowałeś interfejsu GUI, ani go nie używasz, nie ma kodu, który magicznie go utworzy.
Podczas NSLog()
i stałej NSString
W przykładzie nie wymagają basen, nawet trywialne [NSMutableArray array]
nie, biorąc pod uwagę, że może rzeczywiście być interpretowane jako [[[NSMutableArray alloc] init] autorelease]
.
Jeśli znajdziesz inną odpowiedź, która jest szczególnie pomocna, możesz ją "up" i/lub oznaczyć jako poprawną. –