Apa yang dimaksud dengan properti "Nonatomik"?

144

Apa arti "nonatomik" dalam kode ini?

@property(nonatomic, retain) UITextField *theUsersName;

Apa perbedaan antara atom dan nonatomik?

Terima kasih

swiftBoy
sumber
3
Maaf, lupa menentukan ini di Objective-c (cocoa)
Baca juga tautan ini - stackoverflow.com/questions/588866/…
Vijayendra
Bagi siapa pun yang membaca ini, untuk 2014 penting untuk menyadari bahwa banyak informasi ini sangat ketinggalan zaman. Singkatnya, tidak ada alasan untuk menggunakan nonatomik dan pada dasarnya salah untuk menggunakannya, karena alasan apa pun. ini adalah sejarah kuno. Nonatomik berarti "mode ulir yang tidak aman" dan (dalam satu kata) sekarang sama sekali tidak relevan. Beberapa komentar di sini stackoverflow.com/q/23977765/294884
Fattie
Saya tidak setuju dengan pernyataan "tidak relevan". Jika nilainya berubah Jarang dan seperti contoh dalam Apple doc adalah nama belakang. Itu berubah sekali kemudian menggunakan petunjuk atom adalah pemborosan sumber daya yang terlibat karena pemeriksaan tidak diperlukan.
Nick Turner
Inilah jawaban stackoverflow.com/a/32942413/1961064
Grigori Jlavyan

Jawaban:

268

Lihatlah Apple Documents .

Pada dasarnya, jika Anda mengatakan nonatomic, dan Anda menghasilkan pengakses menggunakan@synthesize , maka jika beberapa utas mencoba mengubah / membaca properti sekaligus, kejahatan dapat terjadi. Anda bisa mendapatkan nilai yang ditulis sebagian atau objek yang dirilis berlebihan / dipertahankan, yang dapat dengan mudah menyebabkan crash. (Namun ini berpotensi jauh lebih cepat daripada pengakses atom.)

Jika Anda menggunakan default (yaitu atomic; dulu tidak ada kata kunci untuk ini, tetapi sekarang ada ), maka @synthesizemetode d menggunakan kunci tingkat objek untuk memastikan bahwa banyak pembacaan / penulisan ke properti tunggal diserialisasi. Seperti yang ditunjukkan oleh dokumen Apple, ini tidak berarti seluruh objek aman-utas , tetapi properti individu baca / tulis adalah.

Tentu saja, jika Anda menerapkan accessors Anda sendiri daripada menggunakan @synthesize, saya pikir deklarasi ini tidak melakukan apa-apa selain menyatakan niat Anda apakah properti diimplementasikan dengan cara yang aman.

Jesse Rusak
sumber
7
Saya suka jawaban ini - kurang membingungkan, lebih sederhana dan lebih lengkap daripada yang ditemukan di tempat lain!
PapillonUK
Benar-benar hebat dan kurang membingungkan (+1) tetapi dapatkah Anda memberi tahu mengapa non-atom berpotensi jauh lebih cepat daripada pengakses atom?
Berharap
2
@Apakah aksesor non-atom bisa lebih cepat karena untuk mencegah utas lainnya membaca / menulis pada saat yang sama, Anda perlu memegang mutex atau melakukan beberapa trik tingkat rendah lainnya yang menghabiskan waktu CPU. Jika Anda menggunakan kunci, Anda juga dapat memblokir di utas lainnya, yang juga membutuhkan waktu.
Jesse Rusak
1
@Rob Anda mungkin ingin mengajukan pertanyaan baru tentang itu.
Jesse Rusak
1
@Pratik Maaf, itu tidak benar. Kutipan yang Anda tunjukkan mengatakan hal yang persis sama dengan yang saya lakukan: membuat properti atomicmenghindari crash saat mengakses properti individual tetapi tidak memastikan objek secara keseluruhan (mis. Mengakses properti terpisah seperti nama depan dan belakang) akan dilakukan hal yang benar.
Jesse Rusak
46

Setelah membaca begitu banyak Artikel dan posting StackOverflow, dan telah membuat aplikasi demo untuk memeriksa atribut atribut Variable, saya memutuskan untuk menggabungkan semua informasi atribut

  1. atom // default
  2. nonatomik
  3. strong = retain // default
  4. lemah = tidak aman_kurang
  5. menahan
  6. tetapkan // default
  7. tidak aman_tidak dijaga
  8. menyalin
  9. dibaca saja
  10. readwrite // default

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 kepada semua orang yang memberikan jawaban terbaik di sini !!

Atribut properti variabel atau Pengubah di iOS

  1. atom
    • Atomic berarti hanya satu utas yang mengakses variabel (tipe statis).
    • Atomic aman untuk thread.
    • Tetapi kinerjanya lambat.
    • Atom adalah perilaku default.
    • Accessor atom di lingkungan non-sampah (yaitu saat menggunakan retain / release / autorelease) akan menggunakan kunci untuk memastikan bahwa utas lain tidak mengganggu pengaturan / pengambilan nilai yang benar.
    • sebenarnya bukan kata kunci.

Contoh:

@property (retain) NSString *name;

@synthesize name;
  1. nonatomik
    • Nonatomik berarti beberapa utas mengakses variabel (tipe dinamis).
    • Nonatomic adalah utas yang tidak aman.
    • Tetapi cepat dalam kinerja.
    • Nonatomik BUKAN perilaku default; kita perlu menambahkan kata kunci nonatomik dalam atribut properti.
    • itu dapat mengakibatkan perilaku yang tidak terduga, ketika dua proses (utas) yang berbeda mengakses variabel yang sama pada saat yang sama.

Contoh:

@property (nonatomic, retain) NSString *name;

@synthesize name;
swiftBoy
sumber
12

Selain apa yang telah dikatakan tentang threadsafeness, properti non-atom lebih cepat daripada pengakses atom. Ini bukan sesuatu yang biasanya perlu Anda khawatirkan, tetapi ingatlah itu. Properti Core Data yang dihasilkan sebagian nonatomik karena alasan ini.

Marc Charbonneau
sumber
9

Dalam program multi-ulir, operasi atom tidak dapat diinterupsi sebagian, sedangkan operasi non-atomik dapat.

Oleh karena itu, Anda harus menggunakan mutex (atau sesuatu seperti itu) jika Anda memiliki operasi kritis yang nonatomik yang Anda tidak ingin terputus.

joshdick
sumber
8

Jika Anda menentukan "atomik", fungsi akses yang dihasilkan memiliki beberapa kode tambahan untuk menjaga terhadap pembaruan simultan.

Paul Tomblin
sumber
6

Biasanya atom berarti menulis / membaca ke properti terjadi sebagai operasi tunggal. Operasi Atomic

Jake
sumber
2

Anda dapat menangani barang-barang ini dengan membaca artikel di bawah ini.

Threading Dijelaskan dengan tujuan nonatomik

nonatomik - Tidak Utas Aman

atomic - Thread Safe - Ini adalah atribut properti default.

Easwaramoorthy K
sumber
1
Apakah Anda yakin itu tidak sebaliknya? Sifat-sifat atom yang aman tetapi sifat nonatomic yang tidak aman. Terakhir kali saya memeriksanya adalah seperti itu: P
David Rönnqvist
0

The "atom” berarti bahwa akses ke properti adalah benang-aman. Sedangkan 'nonatomic' adalah kebalikan dari itu. Ketika Anda mendeklarasikan sebuah properti di Objective-C properti adalah atom secara default sehingga accesor disintesis menyediakan akses kuat ke properti dalam lingkungan multithreaded — yaitu, nilai yang dikembalikan dari pengambil atau set melalui setter selalu sepenuhnya diambil atau disetel terlepas dari apa yang dijalankan thread lain secara bersamaan.Tetapi jika Anda mendeklarasikan properti sebagai nonatomik seperti di bawah ini

@property (nonatomic, retain)  NSString *myString;

maka itu berarti accessor yang disintesis untuk properti objek hanya mengembalikan nilai secara langsung. Efek dari atribut nonatomik tergantung pada lingkungan. Secara default, aksesor yang disintesis adalah atom. Jadi nonatomik jauh lebih cepat daripada atom.

AbcTest
sumber
-2

Satu untuk multi thread. Satu bukan


sumber
IMHO: Untuk mendapatkan upvote, Anda harus lebih spesifik dan meluangkan waktu untuk menulis jawaban Anda.
Johan Karlsson