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?
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?
Son iki özdeştir; ( "Atom" varsayılan davranıştır ; sadece yokluğunda tarafından belirtilen aslında bir anahtar kelime olmadığına dikkat - nonatomicatomicLLVM / 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.
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.
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.
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):
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.
Atomik = parçacığı güvenliği
Sigara atom = Hayır parçacığı 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.
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.
atomic:örnek değişken olacak bir çok iş parçacıklı ortamda erişilebilir olup olmadığını.
atomic:Değil kadar hızlı nonatomicçünkü nonatomiczamanında gelen bu konuda herhangi bir bekçi işini gerektirmez.
nonatomic:örnek değişken olacak çoklu iş parçacığı tarafından değiştirilebilir değilse kullanabilirsiniz. Bu performansını artırır.
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.
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:
atomic // Varsayılannonatomicstrong = retain // Varsayılanweak = unsafe_unretainedretainassign // Varsayılanunsafe_unretainedcopyreadonlyreadwrite // VarsayılanMakale 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.
atomic
atomic Sadece bir iplik erişimi değişken (statik tip) anlamına gelir.atomic parçacığı güvenli olduğunu.atomic varsayılan davranıştırÖrnek:
@property (retain) NSString *name;
@synthesize name;
nonatomic
nonatomic Birden fazla iplik erişim değişken (dinamik tip) anlamına gelir.nonatomic parçacığı güvenli değildir.nonatomicvarsayılan davranış DEĞİLDİR. Biz eklemeniz gerekir nonatomicmülkiyet özelliğinde anahtar kelime.Örnek:
@property (nonatomic, retain) NSString *name;
@synthesize name;
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ü.
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
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ı.
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ı.
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.
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 .
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!
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/
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 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 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
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.
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
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.
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
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ı.
@ ö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;
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.
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ı.
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.
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
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.
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);
}
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
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.