“Nonatomik” özelliği ne anlama geliyor?


144

"Kodsuz" bu kodda ne anlama geliyor?

@property(nonatomic, retain) UITextField *theUsersName;

Atomic ve nonatomic arasındaki fark nedir?

Teşekkürler


3
Üzgünüz, bunun Objective-c (kakao) içinde olduğunu belirtmeyi unuttum

Lütfen bu bağlantıyı da okuyun - stackoverflow.com/questions/588866/…
Vijayendra

Bunu okuyan herkes için, 2014 için bu bilgilerin çoğunun çok eski olduğunu fark etmek önemlidir. Tek kelimeyle, anatomik olmayan kullanmak için hiçbir neden yoktur ve herhangi bir nedenle kullanmak hiç yanlış değildir. eski bir tarih. Nonatomik "iplik güvensiz mod" anlamına gelir ve (tek kelimeyle) artık tamamen alakasızdır. Burada bazı yorumlar stackoverflow.com/q/23977765/294884
Fattie

"İlgili olmayan" ifadeye katılmıyorum. Değer Nadiren değişir ve Apple doc'deki örnek soyadıdır. Bir kez daha sonra atomik bir ipucu kullanmak, kontrollere gerek olmadığından kaynakların israfı olur.
Nick Turner

Yanıtlar:


268

Apple Dokümanlarına bir göz atın .

Temel olarak, diyor nonatomicve kullanarak erişimcileri oluşturursanız @synthesize, birden çok iş parçacığı özelliği bir defada değiştirmeye / okumaya çalışırsa, kötülük olabilir. Kısmen yazılmış değerler veya aşırı serbest bırakılmış / tutulan nesneler alabilirsiniz, bu da kolayca çökmelere neden olabilir. (Bu potansiyel olarak bir atomik erişimciden çok daha hızlıdır.)

Varsayılanı kullanırsanız (yani atomic; bunun için anahtar kelime yoktu, ancak şimdi var ), @synthesized yöntemleri tek bir özelliğe birden çok okuma / yazma işleminin serileştirilmesini sağlamak için nesne düzeyinde bir kilit kullanır. Apple belgeleri belirtildiği gibi, bu, tüm nesnenin iş parçacığı için güvenli olduğu anlamına gelmez , ancak tek tek özellik okuma / yazma özelliğidir.

Tabii ki, kullanmak yerine kendi erişimcilerinizi uygularsanız, @synthesizebu bildirimlerin, mülkün güvenli bir şekilde uygulanıp uygulanmadığı konusundaki niyetinizi ifade etmek dışında hiçbir şey yapmadığını düşünüyorum.


7
Bu yanıtı seviyorum - başka yerlerde bulunanlardan daha az kafa karıştırıcı, daha basit ve daha eksiksiz!
PapillonUK

Gerçekten harika bir ve daha az kafa karıştırıcı (+1) ama lütfen atomik olmayanın neden bir atomik erişimciden çok daha hızlı olduğunu söyleyebilir misiniz?
İstek

2
@Wish Atom olmayan erişimciler daha hızlı olabilir, çünkü diğer konuların aynı anda okuma / yazma yapmasını önlemek için, bir muteksi tutmanız veya CPU zamanına mal olan diğer düşük seviyeli numaralar yapmanız gerekir. Bir kilit kullanıyorsanız, zaman alan diğer iş parçacıklarını da engelleyebilirsiniz.
Jesse Rusak

1
@Rob Bu konuda yeni bir soru sormak isteyebilirsiniz.
Jesse Rusak

1
@Pratik Üzgünüm, bu doğru değil. Gösterdiğiniz alıntı yaptığımla tamamen aynı şeyi söylüyor: bir mülk oluşturmak atomic, bireysel özelliklere erişirken çökmeleri önler, ancak nesnenin bir bütün olarak (yani ad ve soyadı gibi ayrı özelliklere erişerek) yapılmasını sağlamaz. doğru şey.
Jesse Rusak

46

Çok sayıda Makale ve StackOverflow yayını okuduktan ve Değişken özellik özelliklerini kontrol etmek için demo uygulamaları yaptıktan sonra, tüm özellik bilgilerini bir araya getirmeye karar verdim

  1. atomik // varsayılan
  2. nonatomic
  3. strong = koru // varsayılan
  4. zayıf = güvenli olmayan
  5. tutmak
  6. ata // varsayılan
  7. unsafe_unretained
  8. kopya
  9. Sadece oku
  10. readwrite // varsayılan

Aşağıda, size kesinlikle yardımcı olacak, yukarıda belirtilen tüm özellikleri bulabileceğiniz ayrıntılı makale bağlantısı bulunmaktadır. Burada en iyi cevapları veren herkese çok teşekkürler !!

İOS'ta değişken özellik özellikleri veya Değiştiriciler

  1. atomik
    • Atomik, değişkene (statik tip) yalnızca bir iş parçacığına erişim anlamına gelir.
    • Atomic iş parçacığı için güvenlidir.
    • Ancak performansta yavaş.
    • Atomik varsayılan davranıştır.
    • Çöp toplanmayan bir ortamda bulunan atom erişimcileri (örneğin, tutma / bırakma / otomatik çalıştırma kullanılırken), başka bir iş parçacığının değerin doğru ayarlanmasını / alınmasını engellemediğinden emin olmak için bir kilit kullanır.
    • aslında bir anahtar kelime değildir.

Misal :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic
    • Nonatomik, değişkenin (dinamik tip) çoklu iş parçacığı erişimi anlamına gelir.
    • Nonatomik iplik güvenli değildir.
    • Ancak performans açısından hızlıdır.
    • Nonatomik varsayılan davranış DEĞİLDİR; özellik özelliğine otomatik olmayan bir anahtar kelime eklememiz gerekir.
    • iki farklı işlem (iş parçacığı) aynı değişkene aynı anda eriştiğinde beklenmeyen davranışlara neden olabilir.

Misal:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

İş parçacığı güvenliği hakkında söylenenlere ek olarak, atomik olmayan özellikler atomik erişimcilere göre daha hızlıdır. Bu genellikle endişelenmeniz gereken bir şey değildir, ancak aklınızda bulundurun. Temel Veri tarafından üretilen özellikler kısmen bu nedenle anatomik değildir.


9

Çok iş parçacıklı bir programda atomik işlem kısmen kesilemezken, atomik olmayan işlemler gerçekleştirilebilir.

Bu nedenle, kesilmesini istemediğiniz anatomik olmayan kritik bir işleminiz varsa muteksleri (veya bunun gibi) kullanmalısınız.


8

"Atomik" belirtirseniz, oluşturulan erişim işlevlerinin eşzamanlı güncellemelere karşı korumak için bazı ekstra kodları vardır.


6

Genellikle atomik, özelliğe yazma / okuma işleminin tek bir işlem olarak gerçekleştiği anlamına gelir. Atomic_operation


2

Aşağıdaki makaleyi okuyarak bu malzemelerin üstesinden gelebilirsiniz.

Dişsizin Amacı İle Açıklanan Diş Açma

nonatomic - Güvenli değil

atomic - Thread Safe - Bu, varsayılan özellik özelliğidir.


1
Bunun tam tersi olmadığından emin misin? Atom özellikleri şunlardır güvenli ama nonatomic özellikleridir değil güvenli. Son kontrol ettiğimde şöyle oldu: P
David Rönnqvist

0

"Atom” özelliğine erişim parçacığı güvenli olduğunu. İken araç 'nonatomic' bunun tersidir. Bu sentezlenmiş erişimcileri özelliğine sağlam erişim sağlar böylece özelliği varsayılan olarak atomiktir Objective-C bir mal beyanında zaman çok iş parçacıklı bir ortamda — yani, alıcıdan döndürülen veya ayarlayıcı aracılığıyla ayarlanan değer, diğer iş parçacıklarının aynı anda yürüttüğünden bağımsız olarak her zaman tam olarak alınır veya ayarlanır. Ancak özelliği aşağıdaki gibi anatomik olmayan olarak bildirirseniz

@property (nonatomic, retain)  NSString *myString;

bir nesne özelliği için sentezlenmiş bir erişimcinin değeri doğrudan döndürmesi anlamına gelir. Atomik olmayan özelliğin etkisi çevreye bağlıdır. Varsayılan olarak, sentezlenen erişimciler atomiktir. Dolayısıyla atomik olmayan atomikten çok daha hızlıdır.


-2

Biri çoklu iplikler içindir. Biri değil


IMHO: Olumlu oy almak için daha spesifik olmanız ve cevabınızı yazmak için biraz zaman harcamalısınız.
Johan Karlsson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.