Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä
Tunnistakaa olioiden ja sulkeumien väliset retain-syklit ja katkaiskaa ne turvallisesti weak - ja unowned -viitteillä.
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 deinitClosure-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 stronglyKatkaise 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 cycleTarkistuslista
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.
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
- ARC:n perusteet: strong / weak / unowned
- Retain-syklit ja niiden katkaiseminen weak/unowned-viitteillä
- Arvotyypit jakamisen vähentämiseen