Menggunakan unowned dan weak dengan aman di Swift

Penggunaan keyword unowned dan weak dalam closure di Swift berpotensi memicu masalah jika kita tidak disiplin dalam pemakaiannya sesuai dengan maksud keyword tersebut masing masing. Sayangnya referensi yang ada pun kadang memberikan saran yang sekilas bertolak belakang.

Beberapa referensi menganjurkan untuk sebisa mungkin menggunakan unowned untuk menghindari silent bug (error/bug yang terjadi saat runtime tapi sistem tidak memberikan feedback/crash0-report), termasuk dokumentasi dari Apple. Tapi di satu sisi dalam prakteknya, tidak mudah menentukan suatu blok aman untuk menggunakan unowned atau tidak. Blok yang terlihat aman untuk penggunaan unonwed, terlihat akan ada selama hal yang diakses di dalamnya ada, kadang punya masalah di kemudian hari. Hal ini kadan ditemukan terutama di code yang berurusan dengan view. Dalam beberapa kasus yang kami temui, bisa ada event handler yang seharusnya sudah tidak fire tapi masih tereksekusi walaupun viewnya seharusnya sudah hilang.

Isu ini pun ditambah lebih kompleks dengan perilaku implementasi bahasa Swift saat ini yang kemungkinan masih ‘buggy’ terkait dengan hal ini. Implementasi yang ada terakhir kadang tidak sesuai dengan yang diharapkan pengguna. Seperti bisa dilihat di artikel ini.

Sejauh ini, rule-of-thumb yang sepertinya cukup aman adalah dengan secara umum menggunakan weak dalam closure. Penegecualian hanya dalam kasus di mana blok closure itu benar benar pasti dipegang oleh scope yang sama e.g: satu class dan proses yang sama. Video ini memberikan keseimbangan yang baik tentang penggunaan keduanya. Analogi yang dipakainya cukup bagus, hubungan yang menggunakan unwoned bisa dianalogikan dengan hubungan seorang manusia dengan organ tubuhnya :

“A human cannot exist without a heart, and a heart cannot exist without a human”

Panduan yang cukup baik untuk menghindari penggunaan unowned yang bisa beresiko.