2011-06-18 15 views
28

Wiem, że w głównej metodzie utworzono pulę autorelease, a wszystkie obiekty, które otrzymują komunikat autoreakcji, zostają zapisane w tej puli i zostają zwolnione po wyczerpaniu puli.Dlaczego warto korzystać z puli autoreas?

Zawsze mówi się o tym, aby unikać autorelowania obiektów w celu uniknięcia wycieków pamięci, a co za tym idzie awarii aplikacji.

To dlaczego i w jakich warunkach powinniśmy używać autoreleasepool?

Dokumentacja Apple sugeruje, że musimy z nich korzystać, gdy używamy wątków, więc na początku wątku musimy utworzyć pulę autorelease i na końcu wątku spuścić, ale co, jeśli nie tworzymy autorelease obiekt w całym wątku, a następnie w tym warunku konieczne jest również utworzenie autoreleasepool na początku wątku.

Proszę wyjaśnij moje zamieszanie. Thanx.

Odpowiedz

19

Twoje założenie jest poprawne. Kiedy możesz upewnić się, że określony wątek nigdy nie korzysta z autorejestrowanych obiektów, wątek ten nie będzie wymagał puli autorelease.

Unikanie autoreleasepool to zła rada, moneta ma dwie strony. Korzystanie z autoreleased obiektów niesie pewną ilość narzutów (choć w większości przypadków jest to mało znaczące), których należy unikać, gdy jest to możliwe. Zwłaszcza w przypadkach, gdy istnieje wiele wyjść do metody lub wyjątek można napotkać, autoodzywanie pomaga uniknąć wycieków pamięci i sprawia, że ​​kod jest czystszy.

Należy jednak pamiętać, że nic nie wskazuje na to, że w tym wątku można używać autoreasytów, w tym dowolnych frameworków, do których można zadzwonić. Są sytuacje, w których tak się dzieje, na przykład w klasycznym scenariuszu producenta/konsumenta. Masz producenta, który tworzy obiekty, przekazuje je do głównego wątku, i może w konsekwencji zarejestrować je w głównym wątku autoreleasepool.

Ogólnie nie polecam tworzenia wątku, w którym wykonuje się istotne prace (oprócz prostych, długich obliczeń) bez automatycznego usuwania.

+0

Czy utworzenie wątku bez puli autorelease spowoduje przeciek pamięci? –

+2

Tak, jeśli autorelease obiekt w tym wątku i nie ma puli będziesz przeciekać. –

+0

Ten jest kontrowersyjny. http://stackoverflow.com/questions/12575010/using-arc-is-it-fatal-not-to-have-an-autorelease-pool-for-every-thread –

Powiązane problemy