0Pricing
Swift Academy · Pelajaran

Siklus retain & pemutusan dengan weak/unowned

Temukan siklus retain antara objek dan closure, lalu putuskan dengan aman menggunakan referensi weak dan unowned .

Siklus retain & pemutusan dengan weak/unowned adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 3 pelajaran total.

Apa itu siklus retensi?

Siklus retensi terjadi saat objek (atau fungsi penutup) menyimpan referensi kuat satu sama lain sehingga ARC tidak pernah mencapai nol. Putus siklus dengan lemah atau tanpa kepemilikan.

Siklus objek ↔ objek

Dua referensi kuat yang mengarah ke kedua arah menyebabkan kebocoran: tidak ada objek yang dapat turun hingga nol.

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)

Memutus dengan lemah

Jadikan satu sisi lemah (sering kali rujukan balik seperti delegasi/induk) agar ARC dapat melepaskan keduanya.

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

Siklus fungsi penutup (self kuat)

Fungsi penutup secara bawaan menangkap variabel dengan kuat. Jika objek juga memiliki fungsi penutup tersebut, terbentuklah siklus.

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

Memutus dengan daftar penangkapan

Gunakan [weak self] (opsional) untuk pembersihan yang aman; gunakan [unowned self] hanya jika self dijamin masih hidup saat fungsi penutup dijalankan.

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

Daftar periksa

Daftar periksa:

  • Apakah ada referensi dua arah? Jadikan satu sisi lemah (misalnya, delegasi).
  • Apakah fungsi penutup disimpan pada suatu tipe? Tangkap [weak self] dan buka bungkusnya dengan aman.
  • Gunakan [unowned self] hanya jika masa hidupnya terjamin; jika tidak, tindakan ini dapat menyebabkan galat.

Lemah vs tanpa kepemilikan dalam fungsi penutup

Pemeriksaan singkat: Daftar penangkapan mana yang lebih aman saat objek mungkin dibebaskan?

Ringkasan

Ringkasan: Identifikasi siklus pada objek dan fungsi penutup. Putus siklus tersebut dengan lemah atau tanpa kepemilikan secara tepat; jika ragu, utamakan lemah.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Siklus retain & pemutusan dengan weak/unowned” gratis?

Ya — teks lengkap “Siklus retain & pemutusan dengan weak/unowned” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Siklus retain & pemutusan dengan weak/unowned”?

Temukan siklus retain antara objek dan closure, lalu putuskan dengan aman menggunakan referensi weak dan unowned . Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 3.

Berapa lama pelajaran “Siklus retain & pemutusan dengan weak/unowned” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar ARC: strong / weak / unowned
  2. Siklus retain & pemutusan dengan weak/unowned
  3. Tipe nilai untuk mengurangi berbagi
← Kembali ke Swift Academy