2009-04-28 8 views

Odpowiedz

25

Należy zauważyć, że komentarze na temat odpowiedzi tlenowej mówią, że -drain nie zwalnia NSAutoreleasePool, są nieprawidłowe. documentation for NSAutoreleasePool wyraźnie mówi, że -drain uwalnia (i tym samym niszczy) NSAutoreleasePool.

-reklama jest zamiennikiem dla użycia - do pracy z obiektami NSAutoreleasePool, z tą różnicą, że stanowi wskazówkę dla systemu czyszczenia pamięci.

+0

Dzięki. Więc w systemie iPhone OS lepiej jest użyć - raczej zrezygnować z - drenażu? – Thanks

+1

W środowisku innym niż GC są takie same. Z wyjątkiem rzadkiego przypadku, gdy z jakiegoś powodu nie chciałbyś podać wskazówki systemowi GC, jeśli kod był kiedykolwiek używany w trybie GC, nie ma powodu, aby używać wersji zamiast drenażu w kierowaniu kodu 10.4+. – smorgan

+1

Apple używa -release dla ARP w funkcji main() ... – Thanks

10

Jeśli system ma zbieranie śmieci, a następnie wysłać wiadomość -drain (objc_collect_if_needed) dla GC

Jeśli nie masz GC, odcedzić = zwolnij

+0

, więc a-drain również uwolni samą pulę, prawda? – Thanks

+1

-retain i -drain metody nie zmienia retainCount obiektu NSAutoreleasePool one tylko wysłać wiadomość zwalniającą do wszystkich obiektów w basenie Nie wiem, w jaki sposób i kiedy obiekty NSAutoreleasePool są destroing ((( – oxigen

+1

Nie, drenaż zwalnia Nie ma żadnej magii, jeśli chodzi o autoreasowanie puli i zatrzymywanie zliczeń, przestrzegają tych samych reguł, co każdy inny obiekt, z tym wyjątkiem, że nie mogą być zatrzymane lub automatycznie usunięte (co zresztą i tak nie miałoby większego sensu) –

10

Oxigen ma rację, zapoznać się z dokumentacją metody drain z NSAutoreleasePool:

W warunkach referencyjnych liczone uwolnienia i zdejmuje odbiornika; w środowisku ze zbieraniem śmieci wyzwala zbieranie śmieci, jeśli pamięć przydzielona od ostatniej kolekcji jest większa niż aktualny próg .

Powiązane problemy