Attribute-C menyatakan atribut @property (nonatomik, salin, kuat, lemah)

289

Dapatkah seseorang menjelaskan kepada saya secara rinci ketika saya harus menggunakan setiap atribut: nonatomic, copy, strong, weak, dan sebagainya, untuk properti menyatakan, dan menjelaskan apa yang masing-masing tidak? Beberapa contoh akan bagus juga. Saya menggunakan ARC.

Gaurav_soni
sumber
Inilah jawaban stackoverflow.com/a/32942413/1961064
Grigori Jlavyan
rypress.com/tutorials/objective-c/properties ini menjelaskan semuanya
Deepak Thakur

Jawaban:

559

Jawaban ini memiliki banyak kesalahan dan juga sudah usang. Silakan lihat pertanyaan / jawaban lain dan komentarnya.


Nonatomik

nonatomicdigunakan untuk tujuan multi-threading. Jika kita telah menetapkan atribut nonatomik pada saat deklarasi, maka utas lain yang menginginkan akses ke objek itu dapat mengaksesnya dan memberikan hasil sehubungan dengan multi-threading.

Menyalin

copydiperlukan ketika objek bisa berubah. Gunakan ini jika Anda memerlukan nilai objek seperti saat ini, dan Anda tidak ingin nilai itu mencerminkan perubahan yang dibuat oleh pemilik objek lain. Anda harus melepaskan objek setelah selesai karena Anda menyimpan salinannya.

Menetapkan

Assignagak berlawanan dengan copy. Saat memanggil pengambil assignproperti, ia mengembalikan referensi ke data aktual. Biasanya Anda menggunakan atribut ini ketika Anda memiliki properti tipe primitif (float, int, BOOL ...)

Menahan

retaindiperlukan ketika atribut adalah penunjuk ke objek. Setter yang dihasilkan oleh @synthesizeakan mempertahankan (alias menambahkan jumlah retain ke) objek. Anda harus melepaskan objek setelah selesai. Dengan menggunakan retain itu akan meningkatkan jumlah retain dan menempati memori di pool autorelease.

Kuat

strongadalah pengganti untuk atribut penahan, sebagai bagian dari Objective-C Automated Reference Counting (ARC). Dalam kode non-ARC itu hanya sinonim untuk mempertahankan.

Ini adalah situs web yang bagus untuk belajar tentang strongdan weakuntuk iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Lemah

weakmirip dengan strongkecuali bahwa itu tidak akan meningkatkan jumlah referensi dengan 1. Itu tidak menjadi pemilik objek itu tetapi hanya memegang referensi untuk itu. Jika jumlah referensi objek turun menjadi 0, meskipun Anda mungkin masih menunjuk ke sini, itu akan dialokasikan dari memori.

Tautan di atas berisi informasi Baik tentang Lemah dan Kuat.

iDhaval
sumber
1
jika Anda menggunakan NSString ini hanya secara internal di kelas itu sendiri daripada Anda bahkan tidak memerlukan properti Anda hanya dapat membuatnya menjadi iVar dan jika Anda menggunakannya di kelas lain daripada yang saya sarankan (kuat, salin).
Ankit Srivastava
1
Anda kehilangan properti Tetapkan.
mskw
10
nonatomicberarti bahwa itu tidak boleh diakses secara bersamaan oleh banyak utas. Defaultnya atomicyang membuatnya aman.
wcochran
1
Agak mengganggu bahwa setelah sekian lama definisi nonatomik masih salah, dan mirip atom. Saya bertanya-tanya berapa banyak orang yang menggunakan ini selama lima tahun terakhir dan mendapatkan kesan yang salah. Apa yang dikatakan @wcochran benar. nonatomik berarti bahwa akses ke pointer tidak ditangani secara atom, sehingga tidak aman untuk thread. Manfaat yang saya mengerti dari nonatomik adalah bobotnya lebih ringan.
John Bushnell
1
Selain komentar @JohnBushnell ada banyak kesalahan dan ketidakakuratan dalam jawaban ini. Itu juga tidak berumur dengan baik, jadi agak bersejarah. Pergi mencari di tempat lain jika Anda mencari jawaban untuk pertanyaan ini.
CRD
45

nonatomic properti menyatakan bahwa objek tidak aman thread yang berarti jika thread berbeda mencoba mengakses objek ini daripada hal-hal buruk dapat terjadi tetapi ini jauh lebih cepat daripada properti atom

strongdigunakan dengan ARC dan itu pada dasarnya membantu Anda, dengan tidak perlu khawatir tentang mempertahankan jumlah objek. ARC secara otomatis melepaskannya untuk Anda ketika Anda selesai dengan itu. Menggunakan kata kunci strongberarti bahwa Anda memiliki objek.

weakkepemilikan berarti bahwa Anda tidak memilikinya dan hanya melacak objek sampai objek yang ditugaskan untuk tetap, segera setelah objek kedua dilepaskan ia kehilangan adalah nilai. Untuk misalnya. obj.a=objectB;digunakan dan memiliki properti lemah, daripada nilainya hanya akan valid sampai objekB tetap ada dalam memori.

copyProperti dijelaskan dengan sangat baik di sini

strong,weak,retain,copy,assignyang saling eksklusif sehingga Anda tidak dapat menggunakannya pada satu objek tunggal ... membaca "Menyatakan Properties" bagian

berharap ini sedikit membantu Anda ...

Ankit Srivastava
sumber
mengapa kuat, lemah, tetap, salin, tetapkan saling eksklusif
vinoth.kumar
nonatomichanya berarti tidak ada pengecualian yang diterapkan. Itu tidak berarti bahwa akses tidak aman. Itu adalah detail implementasi yang atomicvs. nonatomictidak tangkap.
bbum
@bbum Bisakah Anda menjelaskan perbedaan antara tidak ada pengecualian dan tidak aman utas ..?
Ankit Srivastava
1
Pengecualian @AnkitSrivastava adalah ketika utas A memblokir utas B agar tidak turun ke jalur kode. Jika jalur kode itu aman untuk dieksekusi dari banyak utas, maka pengecualian tidak perlu. Bukan utas aman berarti jalur kode dapat menghasilkan hasil yang tidak ditentukan jika A dan B turun secara bersamaan. Yaitu pengecualian dapat digunakan untuk membuat sesuatu thread aman, tetapi keselamatan thread tidak memerlukan eksekusi eksklusif - tidak bersamaan -.
bbum
17

Tautan ini memiliki gangguan

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

menetapkan menyiratkan kepemilikan __unsafe_unretained.

salinan menyiratkan __kuat kepemilikan, serta perilaku semantik salinan biasa pada setter.

mempertahankan menunjukkan kepemilikan yang kuat.

kuat menyiratkan kepemilikan yang kuat.

unsafe_unretained menyiratkan kepemilikan __unsafe_unretained.

lemah menyiratkan kepemilikan __weak.

Mick MacCallum
sumber
bukankah properti Tetapkan hanya digunakan untuk iVar dan nilai? Jadi mengapa itu tidak aman dan mengapa perlu dicatat bahwa itu tidak ditahan?
mskw
9

Jawaban bagus! Satu hal yang ingin saya klarifikasi lebih dalam adalah nonatomic/ atomic. Pengguna harus memahami bahwa properti ini - "atomicity" hanya menyebar pada referensi atribut dan bukan pada kontennya. Yaitu atomicakan menjamin atomicity pengguna untuk membaca / mengatur pointer dan hanya pointer ke atribut. Sebagai contoh:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

Dalam hal ini dijamin bahwa pointer ke dictakan dibaca / diatur dalam cara atom oleh utas yang berbeda. TETAPI dictsendiri (kamus dictmenunjuk) masih thread tidak aman , yaitu semua operasi baca / tambahkan ke kamus masih thread tidak aman.

Jika Anda memerlukan koleksi thread aman, Anda juga memiliki arsitektur yang buruk (lebih sering) ATAU persyaratan nyata (lebih jarang). Jika itu adalah "persyaratan nyata" - Anda harus menemukan komponen pengumpulan aman yang bagus & teruji ATAU bersiaplah untuk uji coba dan kesengsaraan menulis sendiri. Ini kasus terakhir melihat paradigma "bebas kunci", "tunggu". Sepertinya ilmu roket pada pandangan pertama, tetapi dapat membantu Anda mencapai kinerja yang luar biasa dibandingkan dengan "penguncian biasa".

Nickolay
sumber