atomik ve nonatomic nitelikler arasındaki fark nedir?

oy
1k

Ne yapmak atomicve nonatomicmülkiyet beyanlarında demek?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Bu üç arasındaki operasyonel fark nedir?

Oluştur 26/02/2009 saat 03:31
kaynak kullanıcı
Diğer dillerde...                            


27 cevaplar

oy
1k

Son iki özdeştir; ( "Atom" varsayılan davranıştır ; sadece yokluğunda tarafından belirtilen aslında bir anahtar kelime olmadığına dikkatnonatomic - atomicLLVM / clang son sürümlerinde anahtar sözcük olarak eklenmiştir).

Olmayan atom değişikliklerle oluşturulan kod vs atomik yöntem uygulamaları, @synthesizing varsayarsak. Kendi ayarlayıcı / Alıcılar yazıyorsanız, atomik / nonatomic / kopyala yalnızca yol gösterici niteliktedir / atamak / korur. (:; Onlar da otomatik olarak sentezlenmiş olacak ve bir olacak örnek değişkenleri bildirmek gerek de yoktur @synthesize şimdi LLVM son sürümlerinde varsayılan davranıştır. Not _kazara doğrudan erişimi engellemek için kendi adının başına).

"Atom" ile sentezlenmiş ayarlayıcı / alıcı bir sağlayacaktır bütün değeri her zaman başka bir iş parçacığı üzerinde bakılmaksızın setter aktivitenin, setter ile getter dönen ya ayarlanır. Bir autoreleased nesneyi, büyük olasılıkla - - iplik B ayarlayıcı, gerçek bir canlı değeri çağıran ederken iplik A girişken ortasında Yani, eğer A'da arayana iade edilecektir

Olarak nonatomic, böyle bir garanti yapılır. Böylece, nonatomic"atom" çok daha hızlıdır.

Ne "Atom" ne değil yapmak iplik güvenliği konusunda hiçbir garanti olduğunu. Iplik bir iplik B ile aynı anda gaz giderici aradığını ve C farklı değerlerle ayarlayıcı arama durumunda, iplik üç değerlerden herhangi biri döndürülür girebilir - bir önceki herhangi bir ayarlayıcıları denilen veya edilen ayarlayıcıları geçirilen değerlerden herhangi biri B ve Benzer şekilde C de, nesne B veya C değeri ile sona erebilir, bir çok zordur.

Veri bütünlüğünü sağlamak - Çoklu parçacıklı programlama birincil zorluklardan biri - diğer yollarla elde edilir.

Bu ekleme:

atomicity Birden bağımlı özellikler oyunda olduğunda tek özelliğinin de iplik güvenliğini garanti edemez.

Düşünmek:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

Bu durumda, bir çağırarak nesne adını da olabilir iplik setFirstName:ve daha sonra çağrı setLastName:. Bu arada, iplik B çağırabilir fullNameiplik A'nın iki çağrı arasında ve eski soyadı ile birleştiğinde yeni ad alacaktır.

Bu sorunu çözmek için, bir ihtiyaç işlemsel modeli . Bir erişime dışlamak sağlayan senkronizasyonu ve / veya dışlanma başka türlü Yani fullNamebağımlı özellikler güncellenirken.

Cevap 26/02/2009 saat 07:40
kaynak kullanıcı

oy
341

Bu Apple'ın açıklanmıştır belgelere , ancak aşağıda aslında neler olduğunu bazı örneklerdir. Sonra özellik atom olan "nonatomic" belirtmeyen fakat belirterek "atomik" açıkça bir hata ile sonuçlanır, hiçbir "atom" anahtar kelime olduğunu unutmayın.

//@property(nonatomic, retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}

Şimdi, atomik varyant biraz daha karmaşıktır:

//@property(retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }
}

Temel olarak, atomik versiyonu aksi orada, nesne üzerinde ref sayımı (ve onu dengelemek için sallanmasını sayımı) nesnesi arayan için var olmaya da sağlanması amacıyla çarpma ayrıca iplik güvenliğini garanti altına almak için bir kilit almak zorundadır ve başka bir iş parçacığı, değeri ayarlayarak ref sayısı 0'a düşmesi neden olup olmadığını potansiyel bir yarış durumdur.

Orada bu işler özellikler sayıl değerler veya nesneler olup olmamasına bağlı olarak çalışır nasıl farklı türevleri çok sayıda aslında vardır ve etkileşim, kopyalama, salt okunur, nonatomic, vb korumak nasıl. Genel olarak mülkiyet sentezleyiciler sadece tüm kombinasyonları için "doğru olanı" nasıl yapılacağını biliyorum.

Cevap 26/02/2009 saat 07:24
kaynak kullanıcı

oy
147

atomik

  • varsayılan davranıştır
  • Başka bir işlem değişkeni erişmeden önce, CPU ile tamamlanır, bu süreci sağlayacaktır
  • süreç tamamen tamamlanır garanti gibi hızlı değil

Sigara Atom

  • Varsayılan davranış DEĞİLDİR
  • Daha hızlı (sentezlenmiş kodu için, yani @ özellik ve @synthesize kullanılarak oluşturulan değişkenler için)
  • değil iş parçacığı güvenli
  • beklenmeyen davranışlara yol açabilir, iki farklı süreç aynı anda aynı değişkeni eriştiğinizde
Cevap 25/05/2012 saat 11:56
kaynak kullanıcı

oy
124

farkı anlamak için en iyi yolu şu örneği kullanıyor.

"Ad" olarak adlandırılan bir atom dize özelliği vardır varsayalım ve ararsanız [self setName:@"A"]iplik A'dan, çağrı [self setName:@"B"]iplik B'den ve çağrı [self name], daha sonra farklı iş parçacığı üzerinde tüm işlemler tek bir iş parçacığı bir ayarlayıcı yürütülüyorsa yani seri yapılacaktır iplik C veya alıcı, daha sonra diğer ipler bekleyecektir.

Bu özellik "adı" okuma / yazma güvenli yapar, ama başka bir iş parçacığı, D, ararsa [name release]eşzamanlı burada yer alan hiçbir ayarlayıcı / alıcı çağrı olduğundan o zaman bu işlem bir kilitlenme yaratabilir. Bir nesne okunduğu Bunun anlamı / (Atomik) güvenli yazma, ancak parçacığı için güvenli değil başka konu aynı anda nesneye mesajların her türlü gönderebilirsiniz olarak. Geliştirici bu tür nesneler için parçacığı güvenliğini sağlamalıdır.

özelliği "adı," nonatomic ise, daha sonra, yukarıdaki örnekte bütün konuları - A, B, C ve D'nin aynı zamanda herhangi bir tahmin edilemeyen bir sonuç elde yürütülür. Atomik durumunda, ya da A, B veya C bir birinci yürütülür, ancak D yine paralel olarak yürütebilir.

Cevap 31/01/2012 saat 19:36
kaynak kullanıcı

oy
108

Yazım ve mantık zaten bu soruya diğer mükemmel cevaplar tarafından iyi tanımlanmıştır. Çünkü yürütme ve performans de ayrıntılı değildir, benim cevap ekleyecektir.

Bu 3 arasında işlevsel fark nedir?

Hep oldukça meraklı varsayılan olarak atomik kabul ediyorum. % 100 iş parçacığı güvenliği sağlamak için bir araç olarak bir sınıf için atomik özelliklerini kullanarak, çalışmak soyutlama düzeyinde bir köşe durumdur. Gerçekten doğru iş parçacıklı programlar için, programcı tarafından müdahale neredeyse kesin bir gerekliliktir. Bu arada, performans özellikleri ve uygulama yapılmamış derinlemesine ayrıntılı edilmemiştir. Yıllar içinde bazı ağır iş parçacıklı programlar yazılı olması, ben olarak benim özelliklerini bildirmek olmuştu nonatomicatom herhangi bir amaç için mantıklı değildi çünkü tüm süre. Atomik ve nonatomic özelliklerinin ayrıntıları tartışması sırasında bu soru , bazı profil oluşturma bazı meraklı sonuçlar karşılaştı yaptı.

infaz

Tamam. Ben açıklığa kavuşturmak istiyorum ilk şey kilitleme uygulaması uygulama tanımlı ve soyutlanmış olmasıdır. Louis kullanır @synchronized(self)onun örnekte - Ben karışıklık ortak kaynağı olarak bu gördük. Uygulama değil aslında kullanmak @synchronized(self); o nesne seviyesi kullanan sıkma kilitleri . Louis'in illüstrasyon hepimizin aşina olduğu yapılar kullanılarak üst düzey gösterim için iyidir, ama buna kullanmaz bilmek önemlidir @synchronized(self).

Bir başka fark atom özellikleri gaz giderici içinde serbest bırakma çevrimi / Nesnelerinizi muhafaza edecektir.

performans

İşte ilginç kısmı: atomik özelliği kullanılarak Performansı içinde erişir rakipsiz (örn tek iş parçacıklı) bazı durumlarda çok hızlı gerçekten olabilir. İdeal daha az durumlarda, atomik erişimlerin kullanımı 20'den fazla kez yükü mal olabilir nonatomic. Iken Tartışmalı 7 konuları kullanarak vaka üç bayt yapı (2.2 GHz için 44 kat daha yavaş oldu Core i7 Dört Çekirdekli, x86_64). Üç baytlık yapı, çok yavaş bir özelliğinin bir örnektir.

İlginç bir not: Üç bayt yapının Kullanıcı tanımlı erişimcileri sentezlenen atom erişimcilerine 52'dan kat daha hızlı olduğunu; ya da% 84 olarak sentezlenmiş nonatomic erişimci hızı.

itiraz durumlarda nesneler de 50 kez aşabilir.

Nedeniyle uygulamalardaki optimizasyonlar ve varyasyonlara sayısı, bu bağlamlarda gerçek dünya etkilerini ölçmek oldukça zor. Sık sık "sen profili ve bir sorundur bulmak sürece, o güven" gibi bir şey duyabilir. Nedeniyle soyutlama düzeyine, gerçek etkisini ölçmek için aslında oldukça zordur. profillerden fiili maliyetlerin gleaning çok zaman alıcı olabilir ve bağlı soyutlamalara, tamamen yanlış. Bunun yanı sıra, MRC vs ARC büyük bir fark yaratabilir.

O halde, geri adım izin değil , biz gibi olağan şüphelileri ekleriz kere özelliğinin uygulanması üzerinde odaklanma objc_msgSendve birçok aramalar için bazı gerçek dünya üst düzey sonuçlarını incelemek NSStringde getter rakipsiz durumlarda (saniye cinsinden değerler):

  • MRC | nonatomic | manuel olarak uygulamaya getters: 2
  • MRC | nonatomic | Sentezlenen alıcı: 7
  • MRC | atomik | sentez gaz giderici: 47
  • ARC | nonatomic | Sentezlenen alıcı: 38 (not: Burada ARC ekleyerek ref sayımı bisiklet)
  • ARC | atomik | sentez gaz giderici: 47

muhtemelen tahmin gibi, başvuru sayısı aktivite / bisiklet atomics ve ARC altında önemli bir katkıda bulunmaktadır. Ayrıca tartışmalı durumlarda daha büyük farklılıklar görecekti.

Ben performans çok dikkat rağmen, hala demek Semantik İlk! . Bu arada, performansı birçok projeler için düşük önceliktir. Ancak, bilerek çalışma ayrıntıları ve kesinlikle kullanmak teknolojilerin maliyetleri zarar vermez. Eğer ihtiyaçları, amaçları ve yetenekleri için doğru teknolojiyi kullanmalıdır. Umarım bu size karşılaştırmaların birkaç saat kaydedebilir ve programlarınızı tasarlarken daha iyi bilinçli bir karar vermenize yardımcı olacaktır.

Cevap 18/08/2012 saat 10:47
kaynak kullanıcı

oy
88

Atomik = parçacığı güvenliği

Sigara atom = Hayır parçacığı güvenliği

Konu güvenliği:

Örnek değişkenleri evreli birden fazla parçacığı erişildiğinde ne olursa olsun çalışma ortamı tarafından bu iş parçacığı yürütülmesi zamanlama veya serpiştirme, doğru bir şekilde hareket halinde ve arama kodu parçası üzerine herhangi bir ek senkronizasyon veya başka bir koordinasyon vardır.

Bizim bağlamda:

Bir iplik örneğinin değerini değiştirirse değiştirilen değer tüm iş parçacıkları tarafından kullanılabilir ve sadece tek bir iş parçacığı bir anda değerini değiştirebilir.

Nerede kullanmak atomic:

örnek değişken olacak bir çok iş parçacıklı ortamda erişilebilir olup olmadığını.

Implication ait atomic:

Değil kadar hızlı nonatomicçünkü nonatomiczamanında gelen bu konuda herhangi bir bekçi işini gerektirmez.

Nerede kullanmak nonatomic:

örnek değişken olacak çoklu iş parçacığı tarafından değiştirilebilir değilse kullanabilirsiniz. Bu performansını artırır.

Cevap 10/07/2013 saat 14:07
kaynak kullanıcı

oy
67

Ben atomik olmayan atom özelliklerinin oldukça iyi koymak açıklama bulundu burada . İşte aynı bazı ilgili metin var:

'atom' o bozuldu anlamına gelir. OS / programlama açısından bir atom işlev çağrısı kesintiye edilemez biridir - tüm fonksiyon çalıştırılır ve, tamamlanana dek geçiş OS'nin zamanki bağlamda tarafından CPU takas değil edilmelidir. Sadece durumda bilmiyordum CPU sadece bir seferde bir şey yapabilir çünkü OS vermek, çok az zaman-dilimler halinde çalışan tüm süreçlere CPU erişimi döner yanılsamamultitasking. İşlemci zamanlayıcı can (ve) onun yürütülmesinde herhangi bir noktada bir işlemini yarıda - hatta orta işlev çağrısında. Bunlar yani 'atomik' idam edilmeli, iki sürecin aynı anda değişkeni güncellemek için deneyebilirsiniz sayaç değişkenlerini paylaşılan güncellemeniz gibi eylemler için Yani

yürürlükte değişken (ler) diğer bazı iplik / çağrı / fonksiyon alır çünkü yolu aracılığıyla değer yarısını değiştiremez yöntemle okunduğunu yani - Yani bu durumda atom nitelik okuyucu yöntemleri kesilemez anlamına geldiğini tahmin olurdu CPU üzerine değiştirdiler.

Çünkü atomicdeğişkenler kesilemez, herhangi bir noktada bunların içerdiği değer olması garanti (iplik kilidi) 'dir bozulmamış Konuyu kilit sağlanması yavaş onlara erişim sağlar, her ne kadar,. non-atomicdeğişkenler, diğer taraftan, böyle bir garanti yapmak ama daha hızlı erişim lüks sunuyoruz. Özetle, ile gitmek non-atomicsize değişkenleri birden aynı anda parçacığı ve hız şeyler kadar erişilebilir olmayacak bildiğinde.

Cevap 24/02/2012 saat 06:17
kaynak kullanıcı

oy
61

Pek çok makaleler, yığın taşması mesajları okuma ve değişken özellik özelliklerini kontrol etmek için demo uygulamaları yaptıktan sonra, birlikte tüm özellikleri bilgileri yapmaya karar verdik:

  1. atomic // Varsayılan
  2. nonatomic
  3. strong = retain // Varsayılan
  4. weak = unsafe_unretained
  5. retain
  6. assign // Varsayılan
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // Varsayılan

Makale olarak iOS Değişken mülkiyet nitelikler veya değiştiricileri tüm yukarıda zikredilen niteliklere bulabilirsiniz ve bu kesinlikle size yardımcı olacaktır.

  1. atomic

    • atomic Sadece bir iplik erişimi değişken (statik tip) anlamına gelir.
    • atomic parçacığı güvenli olduğunu.
    • Ama performans yavaştır
    • atomic varsayılan davranıştır
    • olmayan bir çöp toplanan ortamında Atom erişimcileri (yani / bırakma / sallanmasını muhafaza kullanılırken) başka bir iş parçacığı değerinin alma / doğru ayara müdahale olmamasını sağlamak için bir kilit kullanır.
    • Aslında bir anahtar kelime değildir.

    Örnek:

        @property (retain) NSString *name;
    
        @synthesize name;
    
  2. nonatomic

    • nonatomic Birden fazla iplik erişim değişken (dinamik tip) anlamına gelir.
    • nonatomic parçacığı güvenli değildir.
    • Ama performans hızlıdır
    • nonatomicvarsayılan davranış DEĞİLDİR. Biz eklemeniz gerekir nonatomicmülkiyet özelliğinde anahtar kelime.
    • İki farklı yöntem (konu), aynı zamanda, aynı değişken erişmek zaman, beklenmedik bir davranış ile sonuçlanabilir.

    Örnek:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    
Cevap 21/03/2013 saat 08:10
kaynak kullanıcı

oy
52

En kolay cevabı ilk: ikinci iki örnek arasında hiçbir fark yoktur. Varsayılan olarak, mülkiyet erişimcileri atom vardır.

olmayan bir çöp toplanan ortamında Atom erişimcileri (yani / bırakma / sallanmasını muhafaza kullanılırken) başka bir iş parçacığı değerinin alma / doğru ayara müdahale olmamasını sağlamak için bir kilit kullanır.

"Bkz Performans ve Threading çok kanallı uygulamalar oluştururken bazı daha fazla bilgi için ve diğer hususlar için Apple'ın Objective-C 2.0 belgelerin" bölümü.

Cevap 26/02/2009 saat 03:56
kaynak kullanıcı

oy
51

atom:

mülke erişmek Atom garantiler atomik bir yapılacaktır. Örneğin her zaman başka erişebilirsiniz önce tamamlamalıdır bir iş parçacığı üzerinde bir tesisin herhangi get / set bir tam olarak başlatıldığını nesneleri döndürür.

Eğer sonuçlar oldukça olmazdı neden görebilirsiniz aynı anda iki iş parçacığı üzerinde meydana gelen aşağıdaki işlevi hayal edin.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

Artıları: tam olarak başlatıldığını nesnelerin Dönüşü her seferinde çoklu iş parçacığı durumunda iyi bir seçim yapar.

Eksileri: Performans hit biraz daha yavaş yürütme yapar

Sigara Atom:

Atomic aksine, tam olarak başlatıldığını nesne her zaman dönmelerini sağlamak etmez.

Artıları: Son derece hızlı yürütme.

Eksileri: çoklu iş parçacığı durumunda çöp değerinin Şansı.

Cevap 26/02/2009 saat 03:41
kaynak kullanıcı

oy
31

Atomik tek iplik değişkeni (statik tip) erişir anlamına gelir. Atom evreli, ama yavaş.

Nonatomic birden çok iş parçacığı değişken (dinamik tip) erişim anlamına gelir. Nonatomic parçacığı güvensiz, ama hızlı.

Cevap 22/11/2012 saat 12:20
kaynak kullanıcı

oy
14

Atomik olduğu parçacığı güvenli , öyle yavaş ve iyi güvence veriyor (garanti) birçok iş parçacığı aynı bölgede üzerinden erişim çalışıyorsunuz nasıl sadece kilitli değer olursa olsun sağlanır. Atomik kullanırken, bu işlev içinde yazılı kodu parçasıdır yalnızca bir evre aynı anda yürütebileceği hangi kritik bölümün parçası haline gelir.

Sadece iplik ile güvenliği; o garanti etmez. Ne demek ki hala garanti otomobil kaza karşılamak ermiyorsa, size araba için bir uzman sürücü işe olduğunu. Ancak, olasılık ufak kalır.

Atom - bu bozuldu olamaz, bu nedenle sonuç bekleniyor. nonatomic ile - beklenmedik bir sonuçtur bu yüzden başka bir iş parçacığı erişim belleği bölge o değiştirebilirsiniz zaman.

Kod Tartışma:

Atomik güvenli mülkiyet dişin alıcı ve ayarlayıcı olun. örneğin u yazdım eğer:

self.myProperty = value;

parçacığı güvenli olduğunu.

[myArray addObject:@"Abc"] 

parçacığı güvenli DEĞİLDİR.

Cevap 07/07/2015 saat 09:56
kaynak kullanıcı

oy
12

Böyle bir anahtar kelime bulunması "atom"

@property(atomic, retain) UITextField *userName;

Biz gibi yukarıdaki kullanabilirsiniz

@property(retain) UITextField *userName;

Yığın taşması soruya bakın ben @property (atomik, korumak) NSString * myString kullanırsam sorunları alıyorum .

Cevap 08/11/2011 saat 06:41
kaynak kullanıcı

oy
11

Varsayılan olan atomicbu size özelliğini her kullandığınızda size performans maliyeti bu demektir, ama iplik güvenlidir. Ne Objective-C, sürece ayarlayıcı / alıcı yürütüldüğünde olarak, bu nedenle yalnızca gerçek iplik değişkeni erişebilir, bir kilidi ayarlanır gelmez.

Bir ivar _internal ile bir özellik MRC Örnek:

[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Yani bu son iki aynıdır:

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName; // defaults to atomic

Öte yandan yapar nonatomicKodunuza şey ekleyin. Güvenlik mekanizmasını kendiniz kodunu Yani sadece parçacığı güvenli olduğunu.

@property(nonatomic, retain) UITextField *userName;

anahtar kelimeler ise ilk mülkiyet niteliği olarak yazılmak zorunda değildir.

Unutmayın, bu bir bütün olarak mülkiyet parçacığı güvenli olduğu anlamına gelmez. Sadece ayarlayıcı / girişken yöntem çağrıdır. 2 farklı parçacığı ile aynı anda bir ayarlayıcı ve bundan sonra bir alıcı kullanıyorsanız Ama, çok kırılmış olabilir!

Cevap 27/09/2013 saat 10:43
kaynak kullanıcı

oy
9

Atomik (varsayılan)

Atom varsayılan: Eğer bir şey yazmazsanız, mülkünüz atomik olduğunu. Bir atom mülkiyet ondan okumaya çalışırsanız, geçerli bir değer geri alacak garantilidir. O değer ne olabileceğini konusunda hiçbir garanti vermez, ama iyi verileri değil, sadece önemsiz hafızasını geri alacak. Ne bu yapmanızı sağlar tek bir değişkene işaret birden konuları veya çoklu süreçleri varsa, bir iş parçacığı okuyabilir ve başka bir iş parçacığı yazabilir olduğunu. Aynı zamanda vurursanız, okuyucu ipliği iki değerden birini almak için garanti edilir: değişiklikten önce veya değişiklikten sonra ya. atomik Ne sana vermez sen alabilirsiniz bu değerlerin hangi teminat herhangi tür. Atom evreli olmak gerçekten yaygın karıştı olduğunu ve doğru değildir. Eğer iplik güvenlik başka yollar garanti etmek gerekir. Ancak, atomik Okumak denerseniz değer bir tür geri almak garanti edecektir.

nonatomic

muhtemelen tahmin olarak flip tarafında, atomik olmayan, sadece anlamına gelir, “Atom şeyler yapma şunu.” Ne kaybetmek her zaman geriye bir şey almak olduğunu garantisidir. Bir yazma ortasında okumaya çalışırsanız, çöp verileri geri alabilir. Ama, öte yandan, sen biraz daha hızlı gidin. atomik özellikleri Bir değer geri almak garanti etmek biraz sihir yapmak zorunda olduğundan, onlar biraz daha yavaş. Eğer çok erişen bir özellik ise, o hız ceza ödemeden etmediğinden emin olmak için aşağı nonatomic düşmesi isteyebilirsiniz.

Daha buraya bakın: https://realm.io/news/tmi-objective-c-property-attributes/

Cevap 23/07/2016 saat 06:34
kaynak kullanıcı

oy
8
  • -Atomik tek iplik erişimi değişken (statik tip) anlamına gelir.
  • -Atomik parçacığı güvenlidir.
  • -but bu performans yavaş

Nasıl ilan etmek:

atomik nedenle varsayılan olduğu için,

@property (retain) NSString *name;

VE uygulama dosyasında

self.name = @"sourov";

Üç özellikleriyle ilgili görevi varsayalım vardır

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

Tüm özellikler (uyumsuz gibi) paralel çalışır.

Eğer iplik dan "adı" çağırırsanız A ,

Ve

Eğer ararsanız aynı zamanda

[self setName:@"Datta"]

iplik gelen B ,

Şimdi ise * ad özelliği nonatomic olduğunu o zaman

  • Bu A için değer "Datta" döndürecektir
  • Bu B için değer "Datta" döndürecektir

Bu yüzden bu olmayan atom güvensiz iplik denilen Ama ama bunun nedeni paralel yürütme performansı hızlıdır

Şimdi ise * ad özelliği atom olduğu

  • Bu A değeri "Sourov" sağlayacaktır
  • Sonra O B için değer "Datta" döndürecektir

Bu yüzden atomik Güvenli iplik denir mi ve bu denir neden güvenli salt yazma bulunuyor

Böyle bir durum operasyonu seri gerçekleştirecek. Ve performansta Yavaş

- nonatomic birden fazla iplik erişim değişken (dinamik türü) anlamına gelir.

- nonatomic güvensiz iplik olduğunu.

- ama performansı hızlı

-Nonatomic biz özellik özelliğinde nonatomic anahtar kelime eklemek gerekir, varsayılan davranış DEĞİLDİR.

In For Swift Swift özellikleri objc anlamda nonatomic düştüğünü belirterek. Eğer başına mülkiyet bölünmezlik ihtiyaçlarınız için yeterli olup olmadığı hakkında düşünmek öylesine bir nedeni olduğunu.

Referans: https://forums.developer.apple.com/thread/25642

Fro daha fazla bilgi web sitesini ziyaret edebilirsiniz http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Cevap 13/12/2016 saat 03:27
kaynak kullanıcı

oy
8

Eğer çok kanallı kod mülkünüzü kullanıyorsanız o zaman nonatomic ve atomik nitelikler arasındaki farkı görmek mümkün olacaktır. Nonatomic atom daha hızlıdır ve evreli, nonatomic değil atomik olduğunu.

Vijayendra Tripathi zaten çok dişli bir ortamda örnek verdi.

Cevap 13/08/2014 saat 12:57
kaynak kullanıcı

oy
7

Başlamadan önce: Eğer hafızada her nesne yeni bir yazma gerçekleşmesi için bellekten ayırmanın gerektiğini bilmesi gerekir. Eğer kağıt üzerinde olduğu gibi sadece basit bir şeyin üstünde yazamam. Sen gerekir ilk silmek (dealloc) bunu ve daha sonra bunun üzerine yazabilirsiniz. Şu anda silme yapılır (ya da yarısı bitti) ve hiçbir şey olduğu takdirde henüz etmiştir yazdı edilmiş (veya yarım yazdım) ve okumak için denemek çok sorunlu olabilir! Atomik ve nonatomic yardım farklı şekillerde bu sorunu tedavi.

İlk okuma bu soruyu ve ardından okunan Bbum cevabını . Ayrıca o zaman benim özetini okuyun.


atomic HER ZAMAN garanti edecek

  • İki farklı insanlar okumak ve aynı zamanda yazmak istiyorsanız, kağıt sadece yanmaz! -> Başvurunuz bile bir yarış durumda, çökmesine asla.
  • 8 harf yazıldığında bir kişi yazmaya çalışıyor ve yazılı 8 harften 4 yazdığım tek ise, o zaman hiçbir ortasında okuyabilir, okuma, yalnızca yapılabilir -> Hayır okuma üzerine gerçekleşecek (olsun) yazılır yazılacak bayt 8 bayt ve sadece 4 bayt varsa yani hala yazıyor bir iş parçacığı '- o ana kadar, bunu okumak için izin verilmez. O zamanlar çökmesine olmayacağını söyledi beri Ama bu değerinden okurdum autoreleased nesne.
  • Eğer daha önce yazılı Eğer var daha önce kağıt üzerinde yazıldığı o silinir ve daha sonra birisi size okumak istiyor olabilir hala okuyun. Nasıl? (Çöp kutusu değil hala% 100 silinir olduğu gibi bu bir belirsizlik içinde var ...) Sen, Mac OS Çöp kutusuna benzer bir yol okuyacağız ThreadA ThreadB zaten yazmaya dealloced ederken okumak için ise --->, yapabilirsin olur ya ThreadB tarafından nihai tamamen yazılı değerden değer elde veya sallanmasını havuzundan bir şey olsun.

Koru sayımları hafıza Objective-C yönetilir edildiği yoldur. Bir nesne oluşturduğunuzda, onun muhafaza sayımı 1 artırılır, yani bir muhafaza mesajı bir nesne göndermek Ne zaman bir nesneyi bir salım ileti gönderdiğinizde bir 1. sayısını korumak vardır, onun muhafaza sayımı 1. zaman sizi azaltılır nesneyi bir gönderme otomatik salma mesajı , onun muhafaza sayımı gelecekte bir aşamada 1 azaltılır. Bir object's sayım 0'a düşürülür korumak, bu ayırmanın.

  • Atomik gelmez iplik güvenliğini sağlamak için olsa da kullanışlı, iplik güvenliğini garanti. Konu Emniyet size yazılı / okuduğunuz iplik kuyruk kodunuzu / yazma nasıl görelidir. Bu sadece sigara crashable çoklu garanti eder.

Bir dakika ne?! Çoklu kullanım ve Are iplik güvenliği farklı?

Evet. Çoklu kullanım anlamı: Birden çok iş parçacığı aynı anda bir veri paylaşılan parçasını okuyabilir ve biz çökme olmaz, henüz olmayan bir autoreleased değerden okuma olmadığını garanti etmez. İplik güvenliği ile, ne okumak otomatik yayımlanan olmadığını hiçbir garantisi yoktur. Orada bir performans maliyeti ve birçok şey gerçekten yok için iplik güvenlik gerektiğinden varsayılan olarak her şeyi atomik yapmazlar nedeni vardır. Bizim kod Birkaç parça ihtiyacı ve bu birkaç parçalar için biz kilitler, Muteksleri veya senkronizasyon kullanarak iş parçacığı güvenli bir şekilde bizim kod yazmak gerekir.


nonatomic

  • (Her ne kadar - (Bu potansiyel olarak çökmesine yol açabilir <), ne de birileri okumaya çalışırsa herkes yazmakta yarısına umurunda Mac OS Çöp Kutusu gibi bir şey olmadığı için, o zaman kimse her zaman bir değer elde olup olmadığını umurunda yarım bellekte yazma kağıda yalnızca yazdım oldu neler yarısını bakınız ederken), size daha önce gelen çılgın aptal değer verebilir bellek, yarım kağıt üzerinde yazılı çok farklıdır -> çünkü çarpmadı garanti etmez o sallanmasını mekanizmasını kullanmaz.
  • Tam yazılı değerleri garanti etmez okunacak!
  • atomik daha hızlıdır

Genel onlar 2 yönleriyle farklıdır:

  • Ezmeye veya olmasın sahip veya sallanmasını havuzu olmamasından dolayı.

  • Izin hakkı sağlayan ve yalnızca değerin ne zaman okumak için izin 'henüz bitmiş yazma veya boş değeri' veya olmasın ortasında okunacak tamamen yazılı.

Cevap 28/04/2016 saat 16:18
kaynak kullanıcı

oy
7

@ özelliği Özellikler hakkında tartışırken önce, @ özelliği kullanımının ne olduğunu bilmelidir. @ özelliği bir sınıf enkapsüle amaçlanmaktadır bilgileri tanımlamak için bir yol sunar. Eğer @ özelliği kullanarak bir nesne / değişken bildirirseniz, o nesne / değişken kendi sınıfını ithal diğer sınıflara erişilebilir olacaktır. Eğer başlık dosyasına @property kullanarak nesneyi bildirmek, o zaman uygulama dosyasında @synthesize kullanarak sentezlemek zorunda.

Örnek:

.h sınıf

@interface ExampleClass : NSObject
   @property (nonatomic, retain) NSString *name;
@end

.m sınıf

@implementation ExampleClass
   @synthesize name;
@end

Şimdi derleyici adı için yöntemler erişimci sentezlemek olacak.

ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];

@ özelliği Özelliklerin listesi: atomik. nonatomic. korur. kopyası. Sadece oku. okuma yazma. atamak. kuvvetli.

atom: Bu varsayılan davranıştır. Bir nesne atom olarak ilan edilirse o zaman iş parçacığı güvenli hale gelir. Konu güvenli araçlar, bir anda bu sınıfın belirli bir örneğinin yalnızca bir iş parçacığı bu nesne üzerinde kontrole sahip olabilir.

Örnek :

@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic

nonatomic: Bu iş parçacığı güvenli değildir. Bunu aynı değer farklı iş parçacığı aynı anda erişilen ne olur hakkında hiçbir garanti ile basitçe ayarlamanız sentezlenmiş erişenleri belirtmek veya doğrudan bir değer döndürmek için nonatomic mülkiyet özelliğini kullanabilirsiniz. Bu nedenle, bir atom olandan nonatomic özelliğe erişmek için hızlı. @property (nonatomic)NSString *name;

korumak: özniteliği sallanmasını havuzda bellek yer alacak, böylece nesnenin sayısını korumak artacak bir object.The setter yöntemi işaret olduğunda gereklidir. @property (retain)NSString *name;

kopya: Eğer kopyasını kullanırsanız, muhafaza kullanamazsınız. sınıfın kopyası örneğini kullanarak kendi kopyası bulunur. Bir değişken dize ayarlamak ve sonradan değiştirilse bile, örneğin o ayarlanır anda sahip olursa olsun değer yakalar. Hiçbir ayarlayıcı ve alıcı yöntemleri sentez edilecektir.

@property (copy) NSString *name;

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"];

salt okunur: Eğer özellik kurucu metod yoluyla değiştirilmesine izin etmek istemiyorsanız, size Salt okunur özelliği bildirebilirsiniz. @property (readonly) NSString *name;

readwrite: varsayılan davranıştır. Açıkça readwrite niteliğini belirtmek gerekmez.

@property (readwrite) NSString *name;

atamak: oldukça kopyalama ya da tutma yerine, direkt olarak örnek değişkeni değer atar bir ayarlayıcı oluşturacaktır. Bu tür delege olarak doğrudan ait olmayan NSInteger ve CGFloat veya nesneler gibi ilkel türleri için en iyisidir.

@property (assign) NSInteger year;

Güçlü: korumak yerine geçer. @property (nonatomic, strong) AVPlayer *player;

unsafe_unretained: Henüz onlardan takip etmek için zayıf bir özelliği veya zayıf yerel değişken bildirimi yapamazsınız, zayıf başvuruları desteklemez Kakao ve kakao Touch birkaç sınıfları vardır. Bu sınıflar vb NSTextView, NSFont ve NSColorSpace içerir. Eğer bu sınıfların birine zayıf başvuru kullanmanız gerekiyorsa, güvenli olmayan bir başvuru kullanmanız gerekir. Bir güvensiz referans onun ilişkili nesne canlı tutmak etmediğini zayıf bir referansa benzer, ancak hedef nesne ayırmanın eğer nil ayarlı edilmeyecektir.

@property (unsafe_unretained) NSObject *unsafeProperty;

Cevap 18/06/2015 saat 05:25
kaynak kullanıcı

oy
4

atomik özellik bakılmaksızın üzerinde getter ve ayarlayıcı yapıyoruz kaç konu bir tam olarak başlatıldığını değerini korumak için sağlar.

nonatomic mülkiyet Sentezlenen erişimcileri basitçe ayarlamak veya aynı değeri farklı iş parçacığı aynı anda erişilen ne olur hakkında hiçbir garanti ile doğrudan bir değer döndürmek belirtir.

Cevap 23/10/2015 saat 15:41
kaynak kullanıcı

oy
3

Atomik tek evre aynı (statik tip) de değişken erişebilir. Atom evreli, ama yavaş.

Nonatomic birden fazla parçacığı, aynı zamanda (dinamik türü) de değişken erişebilir. Nonatomic parçacığı güvensiz, ama hızlı.

Cevap 01/02/2016 saat 08:27
kaynak kullanıcı

oy
2

Eğer atom kullanıyorsanız, bu parçacığı güvenli olması ve salt okunur anlamına gelir. Eğer nonatomic kullanıyorsanız, birden ipler değişken erişebilir ve iplik güvensiz olduğu anlamına gelir, ama hızlı yürütülen bir okuma yapılır ve yazma işlemleri edilir; Bu dinamik bir türüdür.

Cevap 13/02/2016 saat 13:34
kaynak kullanıcı

oy
0

atomik Atomsallık (varsayılan)

Atom varsayılan: Eğer bir şey yazmazsanız, mülkünüz atomik olduğunu. Bir atom mülkiyet ondan okumaya çalışırsanız, geçerli bir değer geri alacak garantilidir. O değer ne olabileceğini konusunda hiçbir garanti vermez, ama iyi verileri değil, sadece önemsiz hafızasını geri alacak. Ne bu yapmanızı sağlar tek bir değişkene işaret birden konuları veya çoklu süreçleri varsa, bir iş parçacığı okuyabilir ve başka bir iş parçacığı yazabilir olduğunu. Aynı zamanda vurursanız, okuyucu ipliği iki değerden birini almak için garanti edilir: değişiklikten önce veya değişiklikten sonra ya. atomik Ne sana vermez sen alabilirsiniz bu değerlerin hangi teminat herhangi tür. Atom evreli olmak gerçekten yaygın karıştı olduğunu ve doğru değildir. Eğer iplik güvenlik başka yollar garanti etmek gerekir. Ancak, atomik Okumak denerseniz değer bir tür geri almak garanti edecektir.

nonatomic

muhtemelen tahmin olarak flip tarafında, atomik olmayan, sadece anlamına gelir, “Atom şeyler yapma şunu.” Ne kaybetmek her zaman geriye bir şey almak olduğunu garantisidir. Bir yazma ortasında okumaya çalışırsanız, çöp verileri geri alabilir. Ama, öte yandan, sen biraz daha hızlı gidin. atomik özellikleri Bir değer geri almak garanti etmek biraz sihir yapmak zorunda olduğundan, onlar biraz daha yavaş. Eğer çok erişen bir özellik ise, o hız ceza ödemeden etmediğinden emin olmak için aşağı nonatomic düşmesi isteyebilirsiniz. Erişim

nezaket https://academy.realm.io/posts/tmi-objective-c-property-attributes/

(Atomik ve nonatomic) atom oranı özelliği özellikleri ilgili silindir özellik bildirimi yansıtılmaz ancak içe özelliği Swift erişildiğinde Amaç-Cı uygulama bölünmezlik garanti kıpırdama.

Böylece - Objective-C atomik özellik tanımlarsanız Swift tarafından kullanıldığında bu atomik kalacaktır.

nezaket https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

Cevap 29/01/2019 saat 06:12
kaynak kullanıcı

oy
0

Atom özellikleri : - Ne zaman yalnızca bir iplik erişimi vardır ve parçacığının güvenli olacak ve varsayılan davranışı olacak, performans açısından iyi olacağı anlamına gelir atom özelliğiyle atanan değişken.

Sigara Atom Özellikleri : - Atomik özelliğiyle atanan değişken o multi-thread erişimi vardır ve parçacığının güvenli olmayacak ve performans perspektifinde yavaş olacaktır varsayılan davranışı elde eder ve bunun anlamı ne zaman iki farklı iş parçacığı aynı anda değişken erişmek istediğinizde beklenmedik sonuçlar verecektir.

Cevap 04/08/2018 saat 11:26
kaynak kullanıcı

oy
0

Gerçek şu ki, atom özelliğini uygulamak için döndürme kilit kullanmasıdır. aşağıdaki gibi kod:

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }
Cevap 09/12/2016 saat 04:58
kaynak kullanıcı

oy
0

Tüm karışıklığı basitleştirmek için object.So değişkenliği kilitler isim gereği nesne bir sınıf tarafından erişilir varsa bize muteks lock.Mutex kilidi anlayalım muteksi sağlamak da aynı object.In iOS @sychronise erişebilir başka hiçbir sınıf görev sizin UI tutun ve performansı düşürebilir olarak atomik özelliklerini kullanarak ana iş parçacığı önlemek erişen nesne üzerinde ise akış aynı instance.However paylaşan iki sınıf etkilenmez FIFO modunda hizmet etmek ve garanti lock.Now

Cevap 23/09/2016 saat 18:41
kaynak kullanıcı

oy
0

Atomik: NSLOCK kullanarak iplik kilitleyerek parçacığı güvenliği sağlayın.

atomik Sigara: hayır parçacığı kilitleme mekanizması olmadığı için iş parçacığı güvenliğini sağlamak değil.

Cevap 29/06/2016 saat 08:56
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more