ARC i autorelease
autorelease jest używana dla zwróconego obiektu funkcji, więc wywołujący nie przejmuje prawa własności i wywołuje zwolnienie obiektu w przyszłości.
Jednak ARC jest w stanie policzyć własność dzwoniącego i zwolnić go po użyciu, to znaczy może zachowywać się tak, jak Smart Pointer w C ++. Dzięki ARC może pozbyć się autorelease, ponieważ autorelease jest niedeterministyczna.
Powodem, dla którego pytam o to pytanie, jest to, że widzę zwrócony obiekt wywołuje dealloc wcześniej w ARC niż kod nie-ARC. Prowadzi mnie to do wniosku, że ARC może zachowywać się jak inteligentny wskaźnik i może sprawić, że autorelease stanie się bezużyteczna. Czy to prawda czy możliwe? Jedyne, co mogę myśleć o użyteczności autorelease, to kod wielowątkowy lub kod sieci, ponieważ może być łatwiej policzyć własność, gdy obiekt przechodzi.
Dzięki za twoje myśli.
Oto nowa edycja, która ma wyjaśnić:
z autorelease
+ (MyClass*) myClass
{
return [[[MyCClass alloc] init] autorelease];
}
- doSomething
{
MyClass *obj = [MyClass myClass];
}
Z ARC:
+ (MyClass*) myClass
{
return [[MyCClass alloc] init]; // no autorelease
}
- doSomething
{
MyClass *obj = [MyClass myClass];
// insert [obj release]
}
Więc naprawdę nie potrzebujemy autorelease.