Sebagai seseorang yang baru di Objective-C, bisakah seseorang memberi saya tinjauan umum tentang mempertahankan, menetapkan, menyalin, dan orang lain yang saya lewatkan, yang mengikuti arahan @ properti? Apa yang mereka lakukan dan mengapa saya ingin menggunakan satu sama lain?
ios
objective-c
iphone
memory-management
Mark Reid
sumber
sumber
Jawaban:
Artikel yang ditautkan oleh MrMage tidak lagi berfungsi. Jadi, inilah yang saya pelajari dalam coding waktu singkat saya di Objective-C:
nonatomic vs atomic - "atomic" adalah default. Selalu gunakan "nonatomik". Saya tidak tahu mengapa, tetapi buku yang saya baca mengatakan "jarang ada alasan" untuk menggunakan "atom". (BTW: Buku yang saya baca adalah buku BNR "iOS Programming".)
readwrite vs readonly - "readwrite" adalah default. Saat Anda mensintesis, pengambil dan penyetel akan dibuat untuk Anda. Jika Anda menggunakan "readonly", tidak ada setter yang akan dibuat. Gunakan untuk nilai yang tidak ingin Anda ubah setelah instantiasi objek.
simpan vs. salin vs. tetapkan
sumber
atomic
sama buruknya dengan memberi sarannonatomic
. Tidak ada pilihan yang "benar", jadi perancang bahasa memilih yang lebih aman dari dua solusi. Bahkan padanonatomic
umumnya pilihan yang lebih baik karena menghilangkan kunci benang yang sangat mahal. Satu-satunya alasan untuk digunakanatomic
adalah jika properti Anda mungkin disetel dari beberapa utas (dalam hal ini menghilangkannya dapat menyebabkan pelepasan berlebih atau kebocoran).Sebelum Anda tahu tentang atribut @ properti, Anda harus tahu apa gunanya @ properti.
@ properti menawarkan cara untuk mendefinisikan informasi bahwa kelas dimaksudkan untuk merangkum. Jika Anda mendeklarasikan objek / variabel menggunakan @property , maka objek / variabel itu akan dapat diakses oleh kelas lain yang mengimpor kelasnya.
Jika Anda mendeklarasikan objek menggunakan @property di file header, maka Anda harus mensintesisnya menggunakan @synthesize dalam file implementasi. Ini membuat objek KVC sesuai . Secara default, kompiler akan mensintesis metode accessor untuk objek ini.
metode accessor adalah: setter dan pengambil.
Contoh: .h
.m
Sekarang kompiler akan mensintesis metode aksesor untuk nama .
Daftar atribut @property
atomik, nonatomik, simpan, salin, baca saja, baca-tulis, tetapkan, kuat, pengambil = metode, setter = metode, tidak aman_tidakdikirim
atom adalah perilaku default. Jika suatu objek dinyatakan sebagai atom maka itu menjadi thread-safe. Thread-safe berarti, pada suatu waktu hanya satu thread dari instance tertentu dari kelas yang dapat memiliki kontrol atas objek itu.
Jika utas melakukan metode pengambil maka utas lainnya tidak dapat melakukan metode setter pada objek itu. Itu lambat.
Karena alasan ini, lebih cepat mengakses properti nonatomik daripada properti atomik.
Metode setter akan meningkatkan jumlah retensi objek, sehingga akan menempati memori dalam kumpulan autorelease.
Bahkan jika string yang dapat diubah diatur dan kemudian diubah, instance menangkap nilai apa pun yang dimilikinya pada saat itu ditetapkan. Tidak ada metode setter dan pengambil yang akan disintesis.
sekarang,
nama akan tetap tidak terpengaruh.
Compiler akan menghasilkan pengambil, tetapi bukan penyetel.
Ini kebalikan dari readonly.
Ingatlah, simpan dan tetapkan pada dasarnya bisa dipertukarkan saat pengumpulan sampah diaktifkan.
Muncul dengan ARC.
Dalam kasus properti Boolean (properti yang memiliki nilai YA atau TIDAK), biasanya metode pengambil dimulai dengan kata "is"
Metode ini harus diakhiri dengan tanda titik dua.
Referensi yang tidak aman mirip dengan referensi yang lemah karena tidak menjaga objek terkait tetap hidup, tetapi tidak akan disetel ke nol jika objek tujuan dideallocated.
Jika Anda perlu menentukan beberapa atribut, cukup sertakan sebagai daftar yang dipisahkan koma, seperti ini:
sumber
@property
dalam file header, maka Anda harus mensintesisnya menggunakan@synthesize
dalam file implementasi." Tidak selalu. Misalnya, "Secara default,readwrite
properti akan didukung oleh variabel instan, yang akan disintesis lagi secara otomatis oleh kompiler." Dari dok .Setelah membaca banyak artikel, saya memutuskan untuk menggabungkan semua informasi atribut:
Di bawah ini adalah tautan ke artikel terperinci di mana Anda dapat menemukan atribut-atribut ini.
Terima kasih banyak kepada semua orang yang memberikan jawaban terbaik di sini !!
Berikut ini Contoh Deskripsi dari Artikel
Contoh:
Contoh:
Menjelaskan:
Misalkan ada properti string atom yang disebut "name", dan jika Anda memanggil [self setName: @ "A"] dari thread A, panggil [self setName: @ "B"] dari thread B, dan panggil [self name] dari utas C, maka semua operasi pada utas berbeda akan dilakukan secara seri yang artinya jika satu utas mengeksekusi setter atau pengambil, maka utas lainnya akan menunggu. Ini membuat properti "nama" aman untuk baca / tulis tetapi jika utas lain memanggil [nama rilis] secara bersamaan maka operasi ini dapat menghasilkan crash karena tidak ada panggilan setter / pengambil yang terlibat di sini. Yang berarti suatu objek membaca / menulis aman (ATOMIC) tetapi tidak aman sebagai utas lain dapat secara bersamaan mengirim semua jenis pesan ke objek. Pengembang harus memastikan keamanan utas untuk objek tersebut.
Jika properti "nama" adalah nonatomik, maka semua utas dalam contoh di atas - A, B, C dan D akan dieksekusi secara bersamaan menghasilkan hasil yang tidak terduga. Dalam hal atom, salah satu dari A, B atau C akan dieksekusi terlebih dahulu tetapi D masih dapat dieksekusi secara paralel.
Contoh:
Contoh:
Penjelasan Kuat & Lemah, Terima Kasih kepada BJ Homer :
Bayangkan objek kita adalah seekor anjing, dan anjing itu ingin melarikan diri (dideallocated). Pointer yang kuat seperti tali pada anjing. Selama Anda memiliki tali pengikat pada anjing, anjing itu tidak akan lari. Jika lima orang mengikatkan tali penuntun mereka pada satu anjing, (lima penunjuk kuat pada satu benda), maka anjing itu tidak akan melarikan diri sampai kelima tali penuntun terlepas. Pointer yang lemah, di sisi lain, seperti anak-anak kecil yang menunjuk ke anjing dan berkata, "Lihat! Seekor anjing!" Selama anjing itu masih terikat, anak-anak kecil masih bisa melihat anjing itu, dan mereka masih akan menunjuk ke sana. Namun, segera setelah semua tali terlepas, anjing itu melarikan diri tidak peduli berapa banyak anak kecil yang menunjuk padanya. Segera setelah penunjuk kuat terakhir (tali penuntun) tidak lagi menunjuk ke suatu objek, objek tersebut akan dibatalkan alokasinya, dan semua penunjuk lemah akan dihilangkan. 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).
Contoh:
Contoh:
tidak aman_tidak dijaga
-unsafe_unretained adalah kualifikasi kepemilikan yang memberi tahu ARC cara memasukkan panggilan retain / release -unsafe_unretained adalah versi penetapan versi ARC.
Contoh:
Contoh:
sumber
Properti atom dapat diakses hanya dengan satu utas pada satu waktu. Ini aman dari utas . Default adalah atom. Harap dicatat bahwa tidak ada atom kata kunci
Nonatomik berarti beberapa utas dapat mengakses item. Ini utas yang tidak aman
Jadi seseorang harus sangat berhati-hati saat menggunakan atom. Karena itu mempengaruhi kinerja kode Anda
sumber
lebih suka tautan ini tentang properti di objektif-c di iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
sumber