Sobes.tech
Junior — Middle

Kako pravilno organizovati linkove u objektnom modelu da bi se sprečilo ciklično zadržavanje memorije?

sobes.tech АИ

Одговор од АИ

Da biste sprečili ciklično zadržavanje memorije u modelu objekata na iOS (koristeći Swift ili Objective-C), važno je pravilno koristiti jake (strong), slabe (weak) i bezvlasničke (unowned) reference.

Glavna ideja:

  • strong — referenca koja poseduje, povećava brojač referenci objekta.
  • weak — referenca koja ne poseduje, ne povećava brojač, automatski se postavlja na nil kada se objekat ukloni.
  • unowned — referenca koja ne poseduje, ne povećava brojač, ali se ne postavlja na nil, koristi se kada je garantovano da objekat traje duže.

Često nastaju ciklusi, na primer, između roditelja i deteta ili između delegata i objekta. Da biste izbegli cikluse:

  • Roditelj drži dete putem strong.
  • Dete referencira roditelja putem weak ili unowned.

Primer u Swift:

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent?  // slab odraz, da se izbegne ciklus
}

let parent = Parent()
let child = Child()
parent.child = child
child.parent = parent

Na ovaj način, kada parent i child prestanu da se koriste, memorija se pravilno oslobađa, bez curenja usled ciklusa.