7. Model zliczania referencji
• Działanie na zasadzie „tokenów”.
• Działa na poziomie runtime.
• Obiekty usuwane są w pamięci kiedy licznik referencji dojdzie
do 0.
• Możemy inkrementować i dekrementować licznik, nie
możemy zwalniać obiektów ręcznie.
• „Właściciel obiektu”.
• Nie obejmuje malloc/free.
• Nie obejmuje obiektów Core Foundation.
8. Zarządzanie pamięcią przed iOS 5
• Podstawowe zasady:
– jesteś właścicielem obiektu, który stworzyłeś,
– możesz przejąć własność obiektu za pomocą retain,
– pozbywasz się obiektu, kiedy go nie potrzebujesz (release,
autorelease),
– nie zwalniasz obiektów, do których nie masz praw
własności.
• Metody dealloc.
• NSAutoreleasePool.
• Osobne zasady dla obiektów Core Foundation.
9. Zarządzanie pamięcią przed iOS 5
• Problemy:
– dużo zbędnej pracy z zarządzaniem pamięcią,
– trudne debugowanie,
– trudna nauka dla nowych programistów,
– mniej uwagi nad właściwą funkcjonalnością aplikacji!
11. ARC
ARC (Automatic Reference Counting):
• nowe narzędzie działające na poziomie kompilacji,
• wymaga Xcode 4.2 i LLVM 3.0,
• uproszcza zarządzanie pamięcią w modelu
retain/release,
• łatwiejsze do nauczenia,
• bezpieczniejsze i bardziej stabilne,
• zwiększające produktywność.
12. ARC
Czym nie jest ARC:
• Garbage Collectorem!,
• automatycznym zarządzaniem pamięcią dla
malloc/free i Core Foundation,
• narzędziem runtime,
• nowym modelem zarządzania pamięcią.
13. Co zyskujemy używając ARC
• Zarządzanie pamięcią na zasadzie grafu powiązań między
obiektami.
• Koniec z retain/release.
• Znikają metody dealloc (z małymi wyjątkami).
• Znikają wywołania autorelease przy zwracaniu obiektu.
• Autorelease pool są czytelniejsze.
• Mniej kodu.
• Mniej błędów związanych z pamięcią.
• Unikanie cykli referencji.
• Automatyczne „nilowanie” zmiennych.
• Kompatybilność wstecz!
15. Zasady używania ARC
1. Nie wywołujemy retain/release/autorelease/dealloc (także
@selector(retain) etc.).
2. Nie implementujemy retain/release.. .
3. Nie używamy wskaźników na obiekty w strukturach
4. Nie używamy NSAutoreleasePool (teraz: @autoreleasepool)
16. Zasady używania ARC c.d.
5. Nie używamy rzutowania typu id <-> void* (używamy
nowych słów kluczowych __bridge itd.
6. Nie używamy assign i retain w deklaracji property. Zamiast
tego weak i strong.
7. Nazwa property nie może zaczynać się od new.
17. Nowe elementy języka
• __weak
• __strong
• __unsafe__unretained
• @property (unsafe_unretained)
• @property (strong)
• @property (weak)
• @autoreleasepool {}
• __bridge itp.
20. Wydajność
Spadek wydajności?
•Poprawiono wydajność retain/release dla NSObject.
•@autoreleasepool szybsze niż NSAutoreleasePool.
•Przesyłanie komunikatów między obiektami szybsze.
•Brak autorelease przy zwracaniu obiektów w metodach = mniej
cykli procesora.
22. Migracja do ARC
• Wszystkie template’y w Xcode 4.2 mają domyślnie
wybraną opcję używania ARC.
• Można wyłączyć.
• Powstało nowe narzędzie migracyjne ze starszych
projektów, które nie używały ARC.
25. Podsumowanie
• Apple zaleca stosowanie ARC.
• Zarządzanie pamięcią jest łatwiejsze.
• Dla doświadczonych programistów „oduczenie się”
starych zasad może być trudne.
• Zyskujemy na czasie.
• Zyskujemy na wydajności.
• Zyskujemy na czytelności kodu.