Swift Academy · Pelajaran

Menghapus Pengamat dengan Aman

Hindari kebocoran dan kerusakan akibat pengamat yang sudah usang.

Pelajaran 3 dari 413 langkah

Menghapus Pengamat dengan Aman adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. 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 4 pelajaran total.

Menghapus Pengamat dengan Aman

Pengamat harus dihapus saat tidak lagi diperlukan. Pengamat yang tertinggal dapat dipicu setelah pemiliknya tidak ada, sehingga menimbulkan kesalahan atau, pada antarmuka lama, aplikasi mogok.

Mengapa Penghapusan Penting

Secara historis, pengamat berbasis pemilih harus dihapus dalam deinit agar objek yang sudah dilepas dari memori tidak menerima pesan.

import Foundation

class Watcher: NSObject {
    override init() { super.init() }
    deinit { NotificationCenter.default.removeObserver(self) }
}
print("Removes itself on deinit")

removeObserver(self)

Memanggil removeObserver(self) membatalkan semua pengamatan yang dibuat oleh objek tersebut dalam satu pemanggilan.

import Foundation

class VM: NSObject {
    func stop() { NotificationCenter.default.removeObserver(self) }
}
VM().stop()
print("Removed all observations for self")

Menghapus Nama Tertentu

Anda dapat menghapus hanya satu pengamatan dengan meneruskan nama dan objeknya, sementara pengamatan lainnya tetap ada.

import Foundation

let center = NotificationCenter.default
let obj = NSObject()
let name = Notification.Name("ping")
center.removeObserver(obj, name: name, object: nil)
print("Removed a specific observation")

Pengamat Berbasis Token

addObserver berbasis fungsi penutupan mengembalikan token opak. Simpan token tersebut, lalu hapus pengamat menggunakan token itu.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: nil) { _ in }
center.removeObserver(token)
print("Removed via token")

Menyimpan Token

Simpan token dalam properti agar token tersebut tetap ada selama Anda menginginkan pengamatan berlangsung, lalu hapus saat sudah selesai.

import Foundation

class Model {
    var token: NSObjectProtocol?
    func start() {
        token = NotificationCenter.default.addObserver(
            forName: Notification.Name("x"), object: nil, queue: nil) { _ in }
    }
    func stop() {
        if let t = token { NotificationCenter.default.removeObserver(t) }
    }
}
let m = Model(); m.start(); m.stop()
print("Lifecycle managed")

Pembersihan Otomatis dengan deinit

Hapus token dalam deinit agar pengamatan berakhir ketika pemiliknya dilepas dari memori.

import Foundation

class Owner {
    var token: NSObjectProtocol?
    deinit { if let t = token { NotificationCenter.default.removeObserver(t) } }
}
print("Token removed on deinit")

Catatan tentang Masa Hidup Modern

Pada lingkungan waktu jalan terbaru, pengamat yang ditambahkan dengan antarmuka berbasis blok dihapus otomatis saat token dilepas dari memori, tetapi penghapusan eksplisit tetap merupakan pilihan yang aman dan jelas.

import Foundation

// Holding the token in a property controls its lifetime.
class C { var token: NSObjectProtocol? }
print("Token lifetime equals observation lifetime")

Menghindari Siklus Retensi

Jika pengamat berupa fungsi penutupan menangkap self secara kuat, gunakan [weak self] untuk menghindari siklus retensi yang mencegah pelepasan dari memori.

import Foundation

class VM {
    var token: NSObjectProtocol?
    func start() {
        token = NotificationCenter.default.addObserver(
            forName: Notification.Name("x"), object: nil, queue: nil) { [weak self] _ in
            self?.handle()
        }
    }
    func handle() { print("handled") }
}
VM().start()

Penghapusan Ganda Aman

Menghapus pengamat yang sudah tidak ada tidak menimbulkan masalah, sehingga pembersihan defensif tidak akan menyebabkan aplikasi mogok.

import Foundation

let center = NotificationCenter.default
let obj = NSObject()
center.removeObserver(obj)
center.removeObserver(obj) // no harm
print("Safe to remove twice")

Ringkasan Praktik Best

Utamakan fungsi penutupan berbasis token, simpan token tersebut, hapus dalam deinit, dan tangkap self secara lemah. Dengan demikian, masa hidup pengamatan tetap benar.

import Foundation

class Best {
    var token: NSObjectProtocol?
    deinit { token.map { NotificationCenter.default.removeObserver($0) } }
}
print("Followed best practices")

Pemeriksaan Singkat

Bagaimana cara menghapus pengamat berbasis fungsi penutupan yang ditambahkan dengan addObserver(forName:...)?

Ringkasan

Selalu hapus pengamat yang tidak lagi Anda perlukan. Gunakan removeObserver(self) untuk pengamat berbasis pemilih dan token yang dikembalikan untuk pengamat berbasis fungsi penutupan, simpan token tersebut, lakukan pembersihan dalam deinit, dan tangkap self secara lemah. Berikutnya: perbandingan pola pengamat dengan alternatifnya.

Gratis untuk memulai

Belajar Swift dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
122
Pelajaran
409

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menghapus Pengamat dengan Aman” gratis?

Ya — teks lengkap “Menghapus Pengamat dengan Aman” 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 4 pelajaran total.

Apa yang akan aku pelajari di “Menghapus Pengamat dengan Aman”?

Hindari kebocoran dan kerusakan akibat pengamat yang sudah usang. 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 3 dari 4.

Berapa lama pelajaran “Menghapus Pengamat dengan Aman” 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. Mengirim dan Mengamati Notifikasi
  2. Payload Notifikasi userInfo
  3. Menghapus Pengamat dengan Aman
  4. Alternatif Pola Observer
← Kembali ke Swift Academy