Apa perbedaan antara atribut penyetel properti lemah dan kuat di Objective-C?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
Apa dampak dan manfaatnya?
Saya mendengar bahwa weak tidak tersedia di iOS 4 dan kami perlu menggunakan assign.
Apakah lemah mirip dengan tugas?
Jawaban:
Anda dapat mengaktifkan atau menonaktifkan ARC untuk file tertentu. Jika aktif, Anda tidak dapat menggunakan
retain
release
autorelease
dll ... Sebagai gantinya Anda menggunakanstrong
weak
untuk properti atau__strong
__weak
untuk variabel (default ke__strong
). Kuat sama dengan mempertahankan, namun ARC akan mengelola rilis untuk Anda.Satu-satunya saat Anda ingin menggunakan weak, adalah jika Anda ingin menghindari siklus penahanan (misalnya, orang tua mempertahankan anak dan anak mempertahankan orang tua sehingga tidak ada yang pernah dilepaskan).
Bagian 'penghubung bebas pulsa' (casting dari
NS
keCF
) agak sedikit rumit. Anda masih harus mengelola secara manualCFRelease()
danCFRetain()
untuk objek CF. Ketika Anda mengubahnya kembali ke objek NS, Anda harus memberi tahu kompiler tentang jumlah retensi sehingga ia tahu apa yang telah Anda lakukan.Semuanya ada di sini .
sumber
Berikut adalah informasi yang saya ketahui tentang properti variabel
jadi di bawah ini adalah tautan artikel terperinci di mana Anda dapat menemukan semua atribut yang disebutkan di atas, yang pasti akan membantu Anda. Terima kasih banyak untuk semua orang yang memberikan jawaban terbaik di sini !!
01. strong (iOS4 = pertahankan) - dikatakan "simpan ini di heap sampai saya tidak menunjuknya lagi" - dengan kata lain "Saya adalah pemiliknya, Anda tidak dapat membatalkan alokasi ini sebelum membidik dengan baik sama seperti mempertahankan "- Kamu menggunakan strong hanya jika kamu perlu mempertahankan objeknya. - Secara default, semua variabel instan dan variabel lokal adalah petunjuk yang kuat. - Kami umumnya menggunakan strong untuk UIViewControllers (orang tua item UI) - strong digunakan dengan ARC dan pada dasarnya membantu Anda, dengan tidak perlu khawatir tentang jumlah retensi objek. ARC secara otomatis melepaskannya untuk Anda setelah Anda selesai menggunakannya. Menggunakan kata kunci kuat berarti Anda memiliki objek tersebut.
Contoh:
02. weak (iOS4 = unsafe_unretained) - dikatakan "simpan ini selama orang lain menunjukkannya dengan kuat" - hal yang sama seperti assign, no keep or release - Referensi "weak" adalah referensi yang tidak Anda simpan. - Kami biasanya menggunakan weak untuk IBOutlets (UIViewController's Childs). Ini berfungsi karena objek turunan hanya perlu ada selama objek induk memilikinya. - referensi lemah adalah referensi yang tidak melindungi objek yang direferensikan dari pengumpulan oleh pengumpul sampah. - Weak pada dasarnya adalah assign, sebuah properti yang tidak dipertahankan. Kecuali ketika objek dibatalkan alokasinya, pointer lemah secara otomatis disetel ke nol
Contoh:
Jelaskan : Terima kasih kepada BJ Homer
Bayangkan objek kita adalah seekor anjing, dan anjing itu ingin melarikan diri (dicabut). Petunjuk yang kuat seperti tali pengikat pada anjing. Selama Anda memiliki tali pengikat yang terpasang 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. Kapan kita menggunakan weak? Satu-satunya saat Anda ingin menggunakan weak, adalah jika Anda ingin menghindari siklus penahanan (misalnya, orang tua mempertahankan anak dan anak mempertahankan orang tua sehingga tidak ada yang pernah dilepaskan).
sumber
strong=retain
danassign
diberi label sebagai default, tetapi tidak boleh keduanya.weak
danstrong
dalam contoh Anda. Bukankah lebih masuk akal bahwa orang tua memilikistrong
referensi ke anak-anaknya (sebagaimyButton
propertiUIViewController
kelas yang telah Anda tunjukkanweak
) dan bahwa anak-anak menyimpanweak
referensi ke orang tuanya (sepertiviewController
properti kelas anak yang Anda ' ve sebagai gantinya diatur kestrong
). Misalnya, membaca Matt Neuburg,iOS 7 Programming Fundamentals
dia menunjukkan bahwa kelas yang menyatakan delegasinya sebagai properti akan membuatnya `lemah, itu tampaknya adil.Untuk menyebutkan bagian dari dokumen yang dirujuk oleh Robert yang menjawab dua pertanyaan terakhir Anda secara eksplisit:
Ini disebut sebagai referensi lemah yang memusatkan perhatian. Anda dapat membuat referensi lemah yang tidak membidik referensi lemah menggunakan __unsafe_unretained, tetapi seperti yang tersirat dari namanya, hal ini umumnya tidak disarankan.
Juga di dokumen:
sumber
__unsafe_unretained
apakah versi ARCassign
.Penggunaan properti WEAK secara jelas adalah sebagai berikut:
sumber
mari kita ambil contoh untuk menguraikan lebih lanjut (jawaban di atas sudah bagus), semoga contoh ini sedikit membantu
mari kita memiliki dua kelas A dan B.
kode di atas akan menghasilkan siklus retensi karena keduanya adalah tipe kuat a --------> b ---------> a
jadi untuk menghindarinya anda harus menggunakan property week salah satunya sehingga mingguan mengacu pada objek dan tidak menambah jumlah referensinya.
sumber