Blog - Jak działa ARC — Automatic Reference Counting
Retain, release, weak/unowned, cykle referencji i co kompilator wstawia za Ciebie w Objective-C oraz Swift.
- Autor
- 2code
- Opublikowano
- Tagi
- iOS
- ARC
- pamięć
ARC (Automatic Reference Counting) to model zarządzania pamięcią w Objective-C i dla klas w Swift: obiekt żyje, dopóki ktoś trzyma na niego silną referencję.
Licznik referencji
Każdy obiekt ma licznik .
- silne przypisanie:
- koniec życia silnej referencji:
- gdy →
deinit/dealloc, pamięć wraca do systemu
Kompilator wstawia retain / release (lub ekwiwalent) w odpowiednich miejscach — nie garbage collector skanujący stertę.
Strong, weak, unowned
…
- strong (domyślnie) — właściciel; trzyma obiekt przy życiu.
- weak — nie zwiększa ; po zwolnieniu obiektu wskazuje
nil(opcjonalne). - unowned — nie zwiększa ; zakładasz, że obiekt jeszcze żyje (crash, jeśli nie).
Cykle retain
Klasyczny problem:
Wtedy i na zawsze → wyciek. Rozwiązanie: jedna strona weak (np. delegate), albo unowned gdy cykl życia jest gwarantowany.
W closure’ach Swift:
someAsync { [weak self] in
guard let self else { return }
self.update()
}
Bez [weak self] closure często trzyma self → cykl z obiektem właściciela.
ARC ≠ GC
| ARC | GC | |
|---|---|---|
| Kiedy sprząta | od razu przy | później / w pauzach |
| Cykle | musisz rozbić ręcznie | zwykle wykrywa |
| Predykcja | niska latencja | możliwy stutter |
Dlatego na iOS ARC dobrze pasuje do UI: brak niespodziewanych pauz GC, ale cykle to Twoja odpowiedzialność.
Autorelease (ObjC)
Historycznie: obiekt może trafić do autorelease pool i dostać release później (np. na końcu run loop). ARC nadal z tym współgra; w ciasnych pętlach czasem warto @autoreleasepool { ... }, by nie kumulować tymczasowych obiektów.
Wniosek
ARC jest proste w happy path i wymagające przy grafach obiektów. Zasada: jedna ścieżka ownershipu strong, domknięcie cykli przez weak, szczególnie w delegate’ach i closure’ach.