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 rr.

  • silne przypisanie: rr+1r \leftarrow r + 1
  • koniec życia silnej referencji: rr1r \leftarrow r - 1
  • gdy r=0r = 0deinit / 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 rr; po zwolnieniu obiektu wskazuje nil (opcjonalne).
  • unowned — nie zwiększa rr; zakładasz, że obiekt jeszcze żyje (crash, jeśli nie).

Cykle retain

Klasyczny problem:

AstrongBstrongAA \xrightarrow{strong} B \xrightarrow{strong} A

Wtedy rA1r_A \ge 1 i rB1r_B \ge 1 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

ARCGC
Kiedy sprzątaod razu przy r=0r=0później / w pauzach
Cyklemusisz rozbić ręczniezwykle wykrywa
Predykcjaniska latencjamoż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.

Wróć do bloga

Porozmawiajmy o Twoim projekcie