Keduanya weak
dan unowned
referensi tidak membuat strong
penangguhan pada objek yang dirujuk (alias mereka tidak menambah jumlah retain untuk mencegah ARC dari deallocating objek yang dirujuk).
Tapi mengapa dua kata kunci? Perbedaan ini berkaitan dengan fakta bahwa Optional
tipe adalah bawaan dalam bahasa Swift. Singkat cerita tentang mereka: tipe opsional menawarkan keamanan memori (ini bekerja dengan baik dengan aturan konstruktor Swift - yang ketat untuk memberikan manfaat ini).
Sebuah weak
referensi memungkinkan kemungkinan untuk menjadi nil
(ini terjadi secara otomatis ketika objek direferensikan deallocated), oleh karena itu jenis properti Anda harus opsional - sehingga Anda, sebagai programmer, wajib untuk memeriksa sebelum Anda menggunakannya (pada dasarnya kompiler memaksa Anda, sebanyak mungkin, untuk menulis kode aman).
Sebuah unowned
mengandaikan referensi bahwa itu tidak akan pernah menjadi nil
selama masa pakai baterai. Referensi yang tidak dimiliki harus ditetapkan selama inisialisasi - ini berarti bahwa referensi akan didefinisikan sebagai jenis non-opsional yang dapat digunakan dengan aman tanpa pemeriksaan. Jika entah bagaimana objek yang dirujuk tidak dapat dialokasikan, maka aplikasi akan macet ketika referensi yang tidak dimiliki akan digunakan.
Dari dokumen Apple :
Gunakan referensi yang lemah kapan pun valid untuk referensi itu menjadi nol pada beberapa titik selama masa pakainya. Sebaliknya, gunakan referensi yang tidak dimiliki ketika Anda tahu bahwa referensi tersebut tidak akan pernah menjadi nol setelah ditetapkan selama inisialisasi.
Dalam dokumen, ada beberapa contoh yang membahas mempertahankan siklus dan cara memutusnya. Semua contoh ini diekstraksi dari dokumen .
Contoh weak
kata kunci:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
weak var tenant: Person?
}
Dan sekarang, untuk beberapa seni ASCII (Anda harus melihat dokumen - mereka memiliki diagram cantik):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
Contoh Person
dan Apartment
menunjukkan situasi di mana dua properti, keduanya diizinkan nol, memiliki potensi untuk menyebabkan siklus referensi yang kuat. Skenario ini paling baik diselesaikan dengan referensi yang lemah. Kedua entitas dapat eksis tanpa memiliki ketergantungan yang ketat pada yang lain.
Contoh unowned
kata kunci:
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}
Dalam contoh ini, a Customer
mungkin atau mungkin tidak memiliki CreditCard
, tetapi a CreditCard
akan selalu dikaitkan dengan a Customer
. Untuk mewakili ini, Customer
kelas memiliki card
properti opsional , tetapi CreditCard
kelas memiliki properti non-opsional (dan tidak dimiliki) customer
.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Contoh Customer
dan CreditCard
memperlihatkan situasi di mana satu properti yang diizinkan menjadi nol dan properti lain yang tidak dapat nol memiliki potensi untuk menyebabkan siklus referensi yang kuat. Skenario ini paling baik diselesaikan dengan referensi yang tidak dimiliki.
Catatan dari Apple:
Referensi yang lemah harus dinyatakan sebagai variabel, untuk menunjukkan bahwa nilainya dapat berubah saat runtime. Referensi yang lemah tidak dapat dinyatakan sebagai konstanta.
Ada juga skenario ketiga ketika kedua properti harus selalu memiliki nilai, dan properti tidak boleh nihil setelah inisialisasi selesai.
Dan ada juga skenario siklus mempertahankan klasik yang harus dihindari ketika bekerja dengan penutupan.
Untuk ini, saya mendorong Anda untuk mengunjungi dokumen Apple , atau membaca buku .