Kali ini kita akan belajar memahami masalah yang sering terjadi saat coding menggunakan Swift programming language yang disebut dengan retain cycle / reference cycle.
Apa itu Retain Cycle / Reference Cycle?
Bahasa Swift memiliki fitur yang disebut dengan Automatic Reference Counting (disingkat ARC). Fitur ini otomatis berjalan saat compile-time. Fitur ini berfungsi untuk cleaning-up objects yang sudah tidak lagi digunakan pada heap memory. Retain cycle terjadi ketika 2 class saling bergantung atau memiliki strong reference satu sama lain, sehingga menyebabkan fitur arc tidak dapat melakukan tugasnya untuk melakukan pembersihan objek reference. Situasi ini merupaka software bug yang disebut dengan istilah memory leak.
Oleh karena kita telah memahami bagaimana retain cycle / reference cycle itu terjadi, maka terdapat beberapa solusi untuk memecahkan masalah tersebut. Weak References ini salah satunya.
Weak References
Weak references merupakan reference yang tidak memiliki peran dalam kepemilikan dari sebuah objek. Objek reference tersebut dapat secara otomatis mendeteksi ketika objek dasar telah hilang atau menjadi nil. Proses otomatisasi ini menjadi alasan mengapa weak reference di deklarasikan dalam bentuk tipe opsional. Objek reference tersebut akan menjadi nil ketika reference count mencapai nilai 0. Yuk langsung kita praktekkan, it’s coding time!
Kita akan mencoba mempraktekkan kasus retain cycle ini dengan menggunakan fitur playground di Xcode.
Buatlah file playground baru, setelah itu tulis class Tutorial & class Editor seperti gambar dibawah ini
Lalu tulis kode berikut, dibawah kode class Editor
Jalankan kodenya.. hasilnya, masing-masing objek tersebut berhasil mengeksekusi blok kode deinit. Namun akan timbul masalah, jika kita merelasikan kedua objek tersebut seperti gambar dibawah ini
Kedua objek tersebut tidak dapat mengeksekusi blok kode deinit masing”. Lho kenapa? Ya karena kita baru saja membuat kasus reference cycle antara objek tutorial dengan objek editor. Akibatnya kita tidak dapat melepaskan kedua objek tersebut dari memory meskipun sudah tidak dibutuhkan.
Oke solusinya adalah dengan membuat weak reference. Tambahkan keyword “weak” pada property editor dalam class Tutorial. Dengan begini, kita dapat memecahkan masalah reference cycle ini.
Coba running playground kembali dan voila! Kedua objek tersebut kini dapat mengeksekusi blok kode deinit masing”
Unowned References
Solusi selanjutnya dalam pemecahan masalah reference cycle ini adalah Unowned Reference, yg mana cara kerjanya mirip dengan weak reference.
Tidak seperti weak reference yang harus dalam bentuk tipe opsional, unowned reference ini selalu memiliki value. Justru kita tidak dapat mendeklarasikannya dalam bentuk tipe opsional.
Oke, untuk contoh kasus, kita bisa berasumsi seperti ini: Suatu tutorial tidak dapat eksis tanpa seorang author. Seseorang harus menulisnya kepada editor. Pada saat yang sama, suatu tutorial sifatnya tidak “memiliki” author sehingga referensinya bersifat unowned.
Mari kita modifikasi class Tutorial seperti pada gambar ini.
Tambahkan juga class Author, tuliskan dibawah deklarasi class Editor.
Dengan begini, kita mendefinisikan bahwa suatu tutorial selalu memiliki author, namun reference Author tidak dideklarasikan dalam bentuk tipe opsional. Di sisi lain, variable tutorials merupakan variable yang dapat bermutasi setelah proses inisialisasi class.
Modifikasi kode dalam blok do{} seperti gambar di bawah ini, lalu jalankan
Pada kasus ini, objek editor dapat di-release dari memory, namun tidak dengan objek lainnya. Disini kita membuat kasus reference cycle baru antara objek tutorial dengan author. Setiap tutorial harus ada authornya, namun dalam skenario ini tidak ada case anonymous author. Jadi sifat properti author pada class Tutorial adalah unowned dimana valuenya juga bukan tipe opsional. Modifikasi deklarasi property pada class Tutorial menjadi seperti pada gambar di bawah ini
Penambahan modifier “unowned” menjadi solusi untuk memecahkan kasus reference cycle tersebut. Blok kode deinit pada masing” objek sekarang dapat ter-eksekusi.
Oke, demikian pembahasan kasus retain cycle / reference cycle pada class dalam bahasa pemorgraman Swift ini. Terima kasih atas waktunya & semoga bermanfaat.
Kode lengkap dari tutorial ini dapat diakses di sini. See you on the next tutorial & Happy Coding!