Masalah terkait memori utama yang masih harus Anda perhatikan adalah mempertahankan siklus. Ini terjadi ketika satu objek memiliki pointer kuat ke yang lain, tetapi objek target memiliki pointer kuat kembali ke aslinya. Bahkan ketika semua referensi lain untuk objek-objek ini dihapus, mereka masih akan saling berpegangan dan tidak akan dirilis. Ini juga dapat terjadi secara tidak langsung, dengan rantai objek yang mungkin memiliki yang terakhir dalam rantai merujuk kembali ke objek sebelumnya.
Karena alasan inilah maka kualifikasi __unsafe_unretained
dan __weak
kepemilikan ada. Yang pertama tidak akan mempertahankan objek yang ditunjuknya, tetapi membuka kemungkinan objek itu akan pergi dan menunjuk ke memori yang buruk, sedangkan yang terakhir tidak mempertahankan objek dan secara otomatis mengatur sendiri sampai nol ketika targetnya dialokasikan. Dari keduanya, __weak
umumnya lebih disukai pada platform yang mendukungnya.
Anda akan menggunakan kualifikasi ini untuk hal-hal seperti delegasi, di mana Anda tidak ingin objek mempertahankan delegasinya dan berpotensi menyebabkan siklus.
Beberapa masalah terkait memori yang signifikan adalah penanganan benda-benda Yayasan Core dan memori yang dialokasikan menggunakan malloc()
untuk jenis seperti char*
. ARC tidak mengelola tipe-tipe ini, hanya objek Objective-C, jadi Anda masih harus menghadapinya sendiri. Jenis Core Foundation bisa sangat rumit, karena kadang-kadang mereka perlu dijembatani untuk mencocokkan objek Objective-C, dan sebaliknya. Ini berarti bahwa kontrol perlu ditransfer bolak-balik dari ARC ketika menjembatani antara tipe CF dan Objective-C. Beberapa kata kunci yang terkait dengan bridging ini telah ditambahkan, dan Mike Ash memiliki deskripsi yang bagus tentang berbagai case bridging dalam penulisan ARC yang panjang .
Selain itu, ada beberapa kasus lain yang lebih jarang, tetapi masih berpotensi bermasalah, yang spesifikasi terperincinya dipublikasikan secara terperinci.
Sebagian besar perilaku baru, berdasarkan pada menjaga benda-benda di sekitar selama ada pointer yang kuat untuk mereka, sangat mirip dengan pengumpulan sampah di Mac. Namun, dasar-dasar teknis sangat berbeda. Daripada memiliki proses pengumpul sampah yang berjalan secara berkala untuk membersihkan objek yang tidak lagi diarahkan, gaya manajemen memori ini bergantung pada aturan mempertahankan / melepaskan yang kaku yang kita semua harus patuhi dalam Objective-C.
ARC hanya mengambil tugas manajemen memori berulang yang harus kami lakukan selama bertahun-tahun dan menurunkannya ke kompiler sehingga kami tidak perlu khawatir lagi. Dengan cara ini, Anda tidak memiliki masalah penghentian atau profil memori gigi gergaji berpengalaman pada platform pengumpulan sampah. Saya sudah mengalami kedua hal ini di sampah saya mengumpulkan aplikasi Mac, dan saya ingin melihat bagaimana mereka berperilaku di bawah ARC.
Untuk informasi lebih lanjut tentang pengumpulan sampah vs. ARC, lihat respons yang sangat menarik ini oleh Chris Lattner di milis Objective-C , di mana ia mendaftar banyak keuntungan ARC dibandingkan pengumpulan sampah Objective-C 2.0. Saya telah mengalami beberapa masalah GC yang dia jelaskan.