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.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
sumber
sumber
Jawaban:
Jawaban ini memiliki banyak kesalahan dan juga sudah usang. Silakan lihat pertanyaan / jawaban lain dan komentarnya.
Nonatomik
nonatomic
digunakan 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
copy
diperlukan 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
Assign
agak berlawanan dengancopy
. Saat memanggil pengambilassign
properti, ia mengembalikan referensi ke data aktual. Biasanya Anda menggunakan atribut ini ketika Anda memiliki properti tipe primitif (float, int, BOOL ...)Menahan
retain
diperlukan ketika atribut adalah penunjuk ke objek. Setter yang dihasilkan oleh@synthesize
akan 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
strong
adalah 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
strong
danweak
untuk iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1Lemah
weak
mirip denganstrong
kecuali 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.
sumber
nonatomic
berarti bahwa itu tidak boleh diakses secara bersamaan oleh banyak utas. Defaultnyaatomic
yang membuatnya aman.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 atomstrong
digunakan 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 kuncistrong
berarti bahwa Anda memiliki objek.weak
kepemilikan 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.copy
Properti dijelaskan dengan sangat baik di sinistrong,weak,retain,copy,assign
yang saling eksklusif sehingga Anda tidak dapat menggunakannya pada satu objek tunggal ... membaca "Menyatakan Properties" bagianberharap ini sedikit membantu Anda ...
sumber
nonatomic
hanya berarti tidak ada pengecualian yang diterapkan. Itu tidak berarti bahwa akses tidak aman. Itu adalah detail implementasi yangatomic
vs.nonatomic
tidak tangkap.Tautan ini memiliki gangguan
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
sumber
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. Yaituatomic
akan menjamin atomicity pengguna untuk membaca / mengatur pointer dan hanya pointer ke atribut. Sebagai contoh:Dalam hal ini dijamin bahwa pointer ke
dict
akan dibaca / diatur dalam cara atom oleh utas yang berbeda. TETAPIdict
sendiri (kamusdict
menunjuk) 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".
sumber