Saya baru mengenal pengembangan iOS5 dan menggunakan objektif-c. Saya kesulitan memahami perbedaan antara penyimpanan kuat dan lemah . Saya telah membaca dokumentasi dan pertanyaan SO lainnya, tetapi semuanya terdengar sama bagi saya tanpa wawasan lebih jauh.
Saya membaca dokumentasinya: Transisi Ke ARC - mengacu pada ketentuan iOS4 untuk mempertahankan, menetapkan, dan melepaskan; yang membuatku bingung. Lalu saya melihat ke Open U CS193p, di mana ia membedakan kuat dan lemah:
Kuat : "simpan ini di tumpukan sampai saya tidak menunjuknya lagi"
Lemah : "simpan ini selama orang lain menunjukkannya dengan kuat"
Bukankah kedua definisi tersebut identik = jika pointer tidak lagi menunjuk ke suatu objek, maka bebaskan memori yang menahan objek tersebut? Saya mengerti konsep pointer, heap, alokasi atau deallocation memori - tapi apa perbedaan antara strong dan weak?
Jawaban:
Perbedaannya adalah bahwa suatu objek akan dibatalkan alokasinya segera setelah tidak ada petunjuk yang kuat untuk itu. Bahkan jika penunjuk lemah menunjuk ke sana, setelah penunjuk kuat terakhir hilang, objek akan dibatalkan alokasinya, dan semua penunjuk lemah yang tersisa akan dikosongkan.
Mungkin contohnya adalah berurutan.
Bayangkan objek kita adalah seekor anjing, dan bahwa anjing itu ingin melarikan diri (dipindahkan).
Petunjuk yang kuat seperti tali pengikat pada anjing. Selama Anda mengikatkan tali pada anjing, anjing tidak akan lari. Jika lima orang memasang tali kekang pada satu anjing, (lima penunjuk kuat ke satu benda), maka anjing tidak akan lari sampai kelima tali dilepaskan.
Petunjuk yang lemah, di sisi lain, seperti anak kecil yang menunjuk ke arah anjing dan berkata "Lihat! Seekor anjing!" Selama anjing masih terikat, anak-anak kecil masih bisa melihat anjing itu, dan mereka masih akan menunjuknya. Namun, segera setelah semua tali dilepaskan, anjing itu melarikan diri tidak peduli berapa banyak anak kecil yang menunjuknya.
Segera setelah penunjuk kuat terakhir (tali) tidak lagi menunjuk ke suatu objek, objek tersebut akan dibatalkan alokasinya, dan semua penunjuk yang lemah akan dikosongkan.
sumber
Benar-benar tidak. Perbedaan utama dalam dua definisi yang Anda tunjukkan adalah "selama orang lain". Itu adalah "orang lain" yang penting.
Pertimbangkan hal berikut:
Sekarang kita punya dua petunjuk
<some_object>
, satu kuat dan satu lemah. Jika kita mengaturstrongObject
untuknil
suka begitu:Kemudian jika Anda mengikuti aturan yang Anda gariskan maka Anda akan bertanya pada diri sendiri pertanyaan-pertanyaan ini:
Kuat: "simpan ini di tumpukan sampai saya tidak menunjukkannya lagi"
strongObject
tidak menunjuk<some_object>
lagi. Jadi kita tidak perlu menyimpannya.Lemah: "simpan ini selama orang lain menunjukkannya dengan kuat"
weakObject
masih menunjuk ke<some_object>
. Tetapi karena tidak ada orang lain yang menunjuk padanya, aturan ini juga berarti bahwa kita tidak perlu menyimpannya.Hasilnya adalah yang
<some_object>
dibatalkan alokasinya dan jika runtime Anda mendukungnya (Lion dan iOS 5 ke atas) makaweakObject
secara otomatis akan diatur kenil
.Sekarang perhatikan apa yang terjadi jika kita menetapkan
weakObject
untuknil
suka begitu:Kemudian jika Anda mengikuti aturan yang Anda gariskan maka Anda akan bertanya pada diri sendiri pertanyaan-pertanyaan ini:
Kuat: "simpan ini di tumpukan sampai saya tidak menunjukkannya lagi"
strongObject
menunjuk ke<some_object>
. Jadi kita perlu menyimpannya.Lemah: "simpan ini selama orang lain menunjukkannya dengan kuat"
weakObject
tidak menunjuk ke<some_object>
.Hasilnya adalah bahwa
<some_object>
ini tidak deallocated, tetapiweakObject
akan menjadinil
pointer.[Perhatikan bahwa semua yang berasumsi
<some_object>
tidak ditunjukkan oleh referensi kuat lain di tempat lain / cara lain untuk "ditahan"]sumber
UIApplication
objek? Itu akan sangat direferensikan oleh cara kerja bagian dalamUIKit
- tetapi Anda tidak perlu khawatir tentang itu.Kuat
Lemah
sumber
Contoh lain: Mahasiswa adalah seorang
Object
, diharapkan bahwa ia dapat lulus (deallocate
) selama ia menyelesaikan semua mata kuliah inti (strong pointers
), tidak peduli ia mengambil mata kuliah pilihan (weak pointers
). Dengan kata lain: penunjuk yang kuat adalah satu-satunya faktor pelepasan alokasi ituObject
.sumber
Tidak, mereka tidak identik tetapi sangat berbeda. Gunakan kuat hanya jika Anda perlu mempertahankan objek. Anda menggunakan weak pada kasus lain, dengan de keuntungannya Anda dapat mengetahui apakah objek telah dihapus dari heap karena tidak ada yang menahannya.
sumber
Saya tahu saya agak terlambat ke pesta ini, tetapi menurut saya penting untuk mengacaukan masalah ini dengan menunjukkan bahwa arti "model memori yang kuat dan lemah" bergantung pada apakah Anda berbicara tentang perangkat lunak atau perangkat keras.
Untuk perangkat keras, lemah atau kuat menunjukkan apakah ada dukungan untuk konsistensi urutan.
WTF apakah itu ada hubungannya dengan memori? Ini menyiratkan bahwa penulisan ke variabel oleh prosesor yang berbeda harus dilihat dalam urutan yang sama oleh semua prosesor. Dalam perangkat keras dengan model yang kuat, ini dijamin. Pada perangkat keras dengan model yang lemah, sebenarnya tidak.
Jawaban yang ada menafsirkan pertanyaan hanya dalam istilah model memori perangkat lunak. Perangkat keras tidak relevan dengan pemrograman. Pertanyaan ini menyebutkan iOS, yang biasanya berjalan pada prosesor Arm7. Arm7 memiliki model memori yang lemah. Untuk programmer yang terbiasa dengan prosesor dengan model yang kuat - kita semua karena x86 dan x64 memiliki model yang kuat - ini adalah jebakan yang buruk. Menggunakan bool untuk memberi sinyal utas lain untuk keluar berfungsi dengan baik dalam model yang kuat. Kode yang sama pada Arm tidak berfungsi sama sekali kecuali Anda menandai bendera tersebut mudah menguap, dan bahkan kemudian tidak menentu.
Meskipun benar bahwa Arm8 + mengubah ini sepenuhnya dengan dukungan eksplisit untuk perolehan / rilis, perangkat lunak lawas tidak menggunakan dukungan ini. Perangkat lunak lawas mencakup ketiga OS ponsel dan semua yang berjalan di atasnya, serta kompiler dan pustaka hingga diperbarui.
Untuk pemeriksaan lebih lanjut tentang topik ini, saya merujuk Anda ke Herb Sutter yang tak ada bandingannya .
sumber