Czy ktoś może wyjaśnić różnice między free()
, release
, autorelease
i dealloc
?Jakie są różnice między wolnymi, dealloc, release i autorelease?
Odpowiedz
Z 4 metod, o których już wspomniałeś, zwykle używasz tylko obiektywów o wartości release
i autorelease
. free
może być używany, gdy używasz c i malloc
w przeciwnym razie powinieneś używać release
i autorelease
.
dealloc
nie powinien być wywoływany przez żaden kod, ponieważ może kolidować z cyklem zatrzymywania/zwolnienia, którego cel-c używa do śledzenia zasobów. Korzystanie z dealloc
prawie na pewno spowoduje awarie w środowisku wykonawczym, jeśli kiedykolwiek z niego skorzystasz.
Ostatecznym zasób użycia release
i autorelease
jest Apple memory management documentation
free
jest przeciwieństwemmalloc
i jest stosowany w C. Nie będzie prawdopodobnie użyć to bardzo programowania w Objective C- Jeśli jesteś właścicielem obiektu, po jego zakończeniu można go ustawić jako obiekt
- . Można również ustawić obiekt jako
autorelease
. Powoduje to automatyczne zwolnienie go po zakończeniu bieżącej pętli iteracji - Gdy licznik odniesień na obiekcie spada do zera, środowisko wykonawcze wywołuje
dealloc
. Nie powinno wywołać tę metodę bardziej
You "własny" przedmiot jeśli alloc
, new
, retain
lub copy
go.
Firma Apple zapewnia na ten temat some good documentation.
free()
to funkcja C, której używa się do pozbycia się niepotrzebnej pamięci uzyskanej za pomocą malloc()
lub innej funkcji, która ma udokumentować, że wymaga wolnej() do zwolnienia pamięci, np. strdup()
.
-dealloc
to selektor Objective-C, który jest wysyłany przez środowisko wykonawcze Objective-C do obiektu, gdy obiekt nie jest już własnością żadnej części aplikacji.
-release
jest selektor wysyłane do obiektu, aby wskazać, że jesteś rezygnując własności tego przedmiotu. Gdy obiekt nie jest własnością nikogo, jest wysyłany komunikat o błędzie -dealloc
przez środowisko wykonawcze.
-autorelease
jest selektor wysyłane do obiektu, aby wskazać, że są rezygnując własność obiektu. Jednakże, jeśli nikt nie jest właścicielem obiektu, ostateczna -dealloc
zostanie odłożona na później, aż do jakiegoś nieokreślonego późniejszego punktu. Rzeczywiście, to, co naprawdę robisz, to przenoszenie własności na pulę autorelease, która następnie zwolni ją, gdy sama zostanie wydana (lub wyczerpana).
Nie można nigdy wysyłać obiektu -dealloc
do obiektu z wyjątkiem super
w metodzie obiektu -dealloc
.
Punkt 3: Nazwałbym to "iteracją pętli biegu" zamiast "pętlą uruchomieniową". Punkt 4: Oczywiście, miałeś zamiar powiedzieć "dealloc" zamiast "release", nieprawdaż? (przepraszam, nitpicking) – Dirk
Dziękuję bardzo. To było zdecydowanie pomocne. – ar106
@Dirk Dobre miejsce. Naprawiony. –