Swift Academy · Oppitunti

Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä

Tunnistakaa olioiden ja sulkeumien väliset retain-syklit ja katkaiskaa ne turvallisesti weak - ja unowned -viitteillä.

Oppitunti 2/38 vaihetta

Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/3. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 3 oppituntia.

Mikä on retain-sykli?

Retain-sykli syntyy, kun oliot tai closuret pitävät toisiinsa strong-viittauksia, joten ARC ei koskaan pääse nollaan. Katkaiskaa syklit weak- tai unowned-viittauksilla.

Olioiden välinen sykli

Kaksi vastakkaissuuntaista strong-viittausta aiheuttaa muistivuodon: kumpikaan olio ei voi saavuttaa nollaa.

final class Owner {
    var gadget: Gadget?
    deinit { print("Owner deinit") }
}
final class Gadget {
    var owner: Owner?
    deinit { print("Gadget deinit") }
}
// Strong ⇄ strong (cycle)
var o: Owner? = Owner()
var g: Gadget? = Gadget()
o!.gadget = g
g!.owner = o
o = nil      // no deinit
g = nil      // still no deinit (leak)

Katkaise weak-viittauksella

Tehkää toisesta puolesta weak (usein takaisiviittauksesta, kuten delegaatista tai omistajasta), jotta ARC voi vapauttaa molemmat.

final class Owner2 {
    var gadget: Gadget2?
    deinit { print("Owner2 deinit") }
}
final class Gadget2 {
    weak var owner: Owner2?   // weak breaks cycle; becomes nil automatically
    deinit { print("Gadget2 deinit") }
}
var o2: Owner2? = Owner2()
var g2: Gadget2? = Gadget2()
o2!.gadget = g2
g2!.owner = o2
o2 = nil     // Owner2 deinit
g2 = nil     // Gadget2 deinit

Closure-sykli (strong self)

Closuret kaappaavat muuttujat oletusarvoisesti strong-viittauksina. Jos olio myös omistaa closuren, syntyy sykli.

final class TimerClient {
    var tick: (() -> Void)?
    deinit { print("TimerClient deinit") }
    func start() {
        // BAD: closure strongly captures self; self keeps tick strongly
        tick = {
            print("tick from", self) // strong capture of self
        }
    }
}
var c: TimerClient? = TimerClient()
c!.start()
c = nil   // no deinit — closure holds self strongly

Katkaise capture-listoilla

Käyttäkää [weak self]-määrettä (valinnainen) turvalliseen vapauttamiseen; käyttäkää [unowned self]-määrettä vain, jos selfin taataan olevan elossa closuren suoritushetkellä.

final class TimerClient2 {
    var tick: (() -> Void)?
    deinit { print("TimerClient2 deinit") }
    func start() {
        // Use [weak self] when self can go away before tick runs
        tick = { [weak self] in
            guard let self = self else { return } // safe unwrap
            print("tick from", self)
        }
        // Alternative when lifetime is guaranteed: [unowned self]
        // tick = { [unowned self] in print("tick from", self) }
    }
}
var c2: TimerClient2? = TimerClient2()
c2!.start()
c2 = nil   // deinit now prints — no cycle

Tarkistuslista

Tarkistuslista:

  • Kaksisuuntaisia viittauksia? Tehkää toisesta puolesta weak (esimerkiksi delegaatti).
  • Säilytetäänkö closureita tyypissä? Kaapatkaa [weak self] ja käsitelkää arvo turvallisesti.
  • Käyttäkää [unowned self]-määrettä vain, kun elinkaari on taattu; muuten se voi aiheuttaa kaatumisen.

weak vai unowned closureissa

Pikatarkistus: Mikä capture-lista on turvallisempi, kun olio voidaan vapauttaa?

Kertaus

Kertaus: Tunnistakaa syklit olioissa ja closureissa. Katkaiskaa ne tilanteen mukaan weak- tai unowned-viittauksilla; suosikaa weak-viittausta, jos olette epävarmoja.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä”?

Tunnistakaa olioiden ja sulkeumien väliset retain-syklit ja katkaiskaa ne turvallisesti weak - ja unowned -viitteillä. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/3.

Kuinka kauan ”Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. ARC:n perusteet: strong / weak / unowned
  2. Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä
  3. Arvotyypit jakamisen vähentämiseen
← Takaisin: Swift Academy