Ada dua atribut manajemen memori baru untuk properti yang diperkenalkan oleh ARC, strong
dan weak
.
Terlepas dari copy
, yang jelas merupakan sesuatu yang sama sekali berbeda, apakah ada perbedaan antara strong
vs retain
dan weak
vs assign
?
Dari pemahaman saya, satu-satunya perbedaan di sini adalah yang weak
akan menetapkan nil
ke pointer, sementara assign
tidak akan, yang berarti program akan macet ketika saya mengirim pesan ke pointer setelah dirilis. Tetapi jika saya menggunakan weak
, ini tidak akan pernah terjadi, karena mengirim pesan ke nil
tidak akan melakukan apa-apa.
Saya tidak tahu tentang perbedaan antara strong
dan retain
.
Apakah ada alasan mengapa saya harus menggunakan assign
dan retain
dalam proyek-proyek baru, atau jenis yang ditinggalkan?
ios
objective-c
ios5
properties
automatic-ref-counting
Jakub Arnold
sumber
sumber
strong
,weak
danunsafe_unretained
.weak
danstrong
) dan 4 kualifikasi seumur hidup variabel (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Lihat Catatan ARC di bawah ini.assign
saat kompilasi dengan ARC adalah kesalahan. Ada banyak jawaban yang dihapus tentang ini. Sepertinya itu sudah berubah sebelum rilis final.unsafe_unretained
adalah atribut yang disukai banyak dari kita pengguna awal. Sebagai bukti,unsafe_unretained
ini adalah atribut yang terlihat di Apple "Programming With Objective-C" di bawah bagian "Encapsulating Data" di bawah subjudul "Gunakan Referensi Tidak Terjamin untuk Beberapa Kelas". Yang mengatakan: "Untuk properti, ini berarti menggunakan atribut unsafe_unretained:"Jawaban:
Dari Transitioning to ARC Release Notes (contoh di bagian atribut properti).
Begitu
strong
juga denganretain
dalam deklarasi properti.Untuk proyek-proyek ARC yang akan saya gunakan
strong
sebagai penggantiretain
, saya akan gunakanassign
untuk properti primitif C danweak
untuk referensi lemah ke objek Objective-C.sumber
assign
untuk objek. Anda harus menggunakan salah satuweak
atauunsafe_unretained
(yang tidak aman, jelas) jika Anda tidak ingin mempertahankan properti.assign
mengkompilasi dengan baik bagi saya dalam proyek ARC dengan target penyebaran 4.0.retain
vsstrong
. Saya kira itu sebagian besar tidak berbahaya, tetapi saya membayangkan itu harusstrong
untuk konsistensi ... atau mungkin tidak masalah. stackoverflow.com/questions/7796476/…assign
masih berlaku dalam beberapa kasus.Setelah membaca begitu banyak artikel, posting Stackoverflow, dan aplikasi demo untuk memeriksa atribut atribut variabel, saya memutuskan untuk menggabungkan semua informasi atribut:
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 kepada semua orang yang memberikan jawaban terbaik di sini !!
1.strong (iOS4 = retain)
Contoh:
2. lemah -
Contoh:
Penjelasan Kuat & Lemah, Terima Kasih kepada BJ Homer :
Kapan kita menggunakan yang lemah?
Satu-satunya waktu Anda ingin menggunakan lemah, adalah jika Anda ingin menghindari siklus mempertahankan (misalnya orang tua mempertahankan anak dan anak mempertahankan orang tua sehingga tidak pernah dilepaskan).
3. tetap = kuat
Contoh:
4. ditugaskan
Contoh:
sumber
default
maksudnya? Jika saya menggunakan@property (nonatomic) NSString *string
itustrong
? Atauassign
? Karena keduanya adalah default.nonatomik / atom
kuat / lemah / tetapkan
(Pilihan)
salinan
dibaca saja
sumber
Sejauh yang saya tahu,
strong
danretain
sinonim, sehingga mereka melakukan hal yang persis sama.Maka
weak
hampir sepertiassign
, tetapi secara otomatis diatur ke nil setelah objek, itu menunjuk ke, tidak dapat dialokasikan.Itu artinya, Anda cukup menggantinya.
Namun , ada satu kasus khusus yang saya temui, di mana saya harus menggunakan
assign
, daripadaweak
. Katakanlah kita memiliki dua propertidelegateAssign
dandelegateWeak
. Dalam keduanya disimpan delegasi kami, yaitu memiliki kami dengan memiliki satu-satunya referensi yang kuat. Delegasi tersebut melakukan deallocating, jadi-dealloc
metode kita dipanggil juga.Delegasi sudah dalam proses deallokasi, tetapi masih belum sepenuhnya dialokasikan. Masalahnya adalah bahwa
weak
referensi kepadanya sudah dibatalkan! PropertidelegateWeak
berisi nil, tetapidelegateAssign
berisi objek yang valid (dengan semua properti sudah dirilis dan dibatalkan, tetapi masih valid).Ini adalah kasus yang cukup khusus, tetapi ini menunjukkan kepada kita bagaimana
weak
variabel - variabel itu bekerja dan kapan mereka dibatalkan.sumber
Dokumen Clang tentang Objective-C Automatic Reference Counting (ARC) menjelaskan kualifikasi dan pengubah kepemilikan dengan jelas:
Lalu ada enam pengubah kepemilikan untuk properti yang dinyatakan:
Semantik bijaksana, kualifikasi kepemilikan memiliki arti yang berbeda dalam lima operasi yang dikelola : Membaca, Penugasan, Inisialisasi, Penghancuran dan Memindahkan, di mana sebagian besar waktu kita hanya peduli tentang perbedaan dalam operasi Penugasan.
Perbedaan lain dalam Reading, Init, Destruction dan Moving, silakan merujuk ke Bagian 4.2 Semantik dalam dokumen .
sumber
Untuk memahami referensi Strong dan Lemah, perhatikan contoh di bawah ini, misalkan kita memiliki metode yang dinamai displayLocalVariable.
Dalam lingkup metode di atas variabel myName terbatas pada metode displayLocalVariable, setelah metode selesai variabel myName yang memegang string "ABC" akan mendapatkan deallocated dari memori.
Sekarang bagaimana jika kita ingin memegang nilai variabel myName sepanjang siklus hidup pengontrol tampilan kita. Untuk ini, kita dapat membuat properti bernama nama pengguna yang akan memiliki referensi kuat ke variabel myName (lihat
self.username = myName;
di bawah kode), seperti di bawah ini,Sekarang dalam kode di atas Anda dapat melihat myName telah ditetapkan untuk self.username dan self.username memiliki referensi yang kuat (seperti yang kita nyatakan dalam antarmuka menggunakan @property) ke myName (secara tidak langsung itu memiliki referensi kuat ke string "ABC"). Karenanya String myName tidak akan dapat dialokasikan dari memori sampai self.username hidup.
Sekarang pertimbangkan untuk menetapkan myName ke dummyName yang merupakan referensi Lemah, self.dummyName = myName; Tidak seperti referensi kuat. Lemah hanya akan memegang nama saya sampai ada referensi kuat untuk nama saya. Lihat kode di bawah ini untuk memahami referensi Lemah,
Dalam kode di atas ada referensi lemah ke myName (yaitu self.dummyName memiliki referensi lemah ke myName) tetapi tidak ada referensi kuat untuk myName, maka self.dummyName tidak akan dapat memegang nilai myName.
Sekarang pertimbangkan lagi kode di bawah ini,
Dalam kode di atas self.username memiliki referensi Strong ke myName, maka self.dummyName sekarang akan memiliki nilai myName bahkan setelah metode berakhir karena myName memiliki referensi Strong yang terkait dengannya.
Sekarang setiap kali kita membuat referensi Strong ke suatu variabel, jumlah retainnya bertambah satu dan variabel tidak akan mendapatkan deallocated, retain count mencapai 0.
Semoga ini membantu.
sumber
Kuat:
Contoh: @property (kuat, nonatomik) ViewController * viewController;
@ mensintesis viewController;
Lemah
Secara default, secara otomatis dapatkan dan atur ke nol
Contoh: @ properti (lemah, non-atomik) IBOutlet UIButton * myButton;
@ mensintesis myButton;
sumber
Perbedaan antara yang kuat dan yang dipertahankan:
Perbedaan antara yang lemah dan yang ditetapkan:
sumber