Objective-C @property özniteliklerini beyan etti (otomatik olmayan, kopya, güçlü, zayıf)


289

: Her özellik kullanmak gerektiğinde birisi detaylı bir şekilde açıklayabilir misin nonatomic, copy, strong, weak, ve bu yüzden, üzerinde bildirilen bir özelliği için ve her ne anlatmak? Bir çeşit örnek de harika olurdu. ARC kullanıyorum.



Yanıtlar:


559

Bu cevabın çok sayıda hatası var ve aynı zamanda modası geçmiş. Lütfen diğer sorulara / cevaplara ve yorumlara bakınız.


nonatomic

nonatomicçoklu diş açma amaçları için kullanılır. Beyan sırasında atomik olmayan bir öznitelik belirlediysek, o nesneye erişmek isteyen diğer herhangi bir iş parçacığı ona erişebilir ve çoklu iş parçacığıyla ilgili sonuçlar verebilir.

kopya

copynesne değiştirilebilir olduğunda gereklidir. Nesnenin değerine şu anda olduğu gibi ihtiyacınız varsa ve bu değerin nesnenin diğer sahipleri tarafından yapılan değişiklikleri yansıtmasını istemiyorsanız bunu kullanın. Kopyayı sakladığınız için nesneyi işiniz bittiğinde serbest bırakmanız gerekir.

Atamak

Assignbiraz tersidir copy. Bir assignmülkün alıcısını çağırırken, gerçek verilere bir referans döndürür. Bu özelliği, ilkel tipte bir özellik (float, int, BOOL ...) olduğunda genellikle kullanırsınız.

tutmak

retainöznitelik bir nesneye işaretçi olduğunda gereklidir. Tarafından oluşturulan ayarlayıcı @synthesizenesneyi alıkoyacaktır (diğer bir deyişle alıkoyma sayısı ekleyecektir). İşiniz bittiğinde nesneyi bırakmanız gerekir. Muhafaza işlevini kullanmak, saklama sayısını artıracak ve otomatik kiralama havuzunda belleği kaplayacaktır.

kuvvetli

strongObjective-C Otomatik Referans Sayımının (ARC) bir parçası olarak retain niteliğinin yerine geçer. ARC olmayan kodda, sadece alıkonma ile eşanlamlıdır.

Bu, iOS 5 strongve weakiOS 5 hakkında bilgi edinmek için iyi bir web sitesidir . Http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Güçsüz

weak, strongreferans sayısını 1 artırmayacağı dışındakine benzer . Bu nesnenin sahibi olmaz, ancak ona bir referans tutar. Nesnenin referans sayısı 0'a düşerse, yine de burada işaret ediyor olsanız bile, bellekten çıkarılacaktır.

Yukarıdaki bağlantı Zayıf ve Güçlü hakkında iyi bilgiler içermektedir .


1
bu NSString'i sadece kendi içinde bir sınıfın içinde bir özelliğe bile ihtiyacınız olmadığından kullanıyorsanız, bunu bir iVar yapabilirsiniz ve bunu tavsiye edeceğimden başka bir sınıfta kullanıyorsanız (güçlü, kopya).
Ankit Srivastava

1
Ata özelliğini eksik.
mskw

10
nonatomicbu gerektiği anlamına değil birden fazla ilmek aynı anda erişilebilir. Varsayılan, atomiciş parçacığının güvenli olmasını sağlar.
wcochran

1
Bunca zamandan sonra atomik olmayan tanımın hala yanlış olması ve atomikliğe benzemesi biraz rahatsız edici. Son beş yılda kaç kişinin bunu kullandığını merak ediyorum ve yanlış izlenim edindim. @Wcochran'ın söyledikleri doğruydu. anatomik olmayan, işaretçiye erişimin atomik olarak ele alınmadığı ve iş parçacığı için güvenli olmadığı anlamına gelir. Atomik olmayanı anladığımdaki fayda, daha hafif olması.
John Bushnell

1
@JohnBushnell yorumuna ek olarak, bu cevapta başka birçok hata ve yanlışlık var. Ayrıca iyi yaşlanmadı, bu yüzden biraz tarihsel. Bu sorunun cevabını arıyorsanız başka bir yere bakın.
CRD

45

nonatomic özelliği, nesnenin iş parçacığı için güvenli olmadığını belirtir; bu, kötü şeyler olabileceğinden farklı bir iş parçacığı bu nesneye erişmeye çalışırsa, ancak atom özelliğinden çok daha hızlı olduğu anlamına gelir.

strongARC ile birlikte kullanılır ve bir nesnenin alıkonma sayısı konusunda endişelenmenize gerek kalmadan size yardımcı olur. ARC, işiniz bittiğinde sizin için otomatik olarak serbest bırakır.Anahtar kelimeyi kullanmak strong, nesneye sahip olduğunuz anlamına gelir.

weaksahiplik, ona sahip olmadığınız anlamına gelir ve ikinci nesneyi serbest bırakıldığı anda değer kaybedilene kadar, atandığı nesne kalıncaya kadar nesneyi izler. Örneğin. obj.a=objectB;kullanılır ve zayıf bir özelliğe sahiptir, değeri yalnızca objectB bellekte kalana kadar geçerli olur.

copymülkiyet burada çok iyi açıklanmıştır

strong,weak,retain,copy,assignbirbirini dışlar, böylece onları tek bir nesnede kullanamazsınız ... "Beyan Edilen Özellikler" bölümünü okuyun

bunun size biraz yardımcı olacağını umarak ...


neden güçlü, zayıf,
saklamak

nonatomicyalnızca dışlama uygulanmadığı anlamına gelir. Bu, erişimin iş parçacığı için güvenli olmadığı anlamına gelmez. Bu, atomicvs'nin nonatomicyakalamadığı bir uygulama detayıdır .
bbum

@bbum Dışlama yok ve iş parçacığı için güvenli değil arasındaki farkı açıklayabilir misiniz?
Ankit Srivastava

1
@AnkitSrivastava hariç tutma , A iş parçacığının B iş parçacığının bir kod yolundan gitmesini engellediği durumdur . Bu kod yolu birden çok iş parçacığından yürütülmesi için güvenliyse, dışlama gerekmez. Güvenli değil , A ve B aynı anda aşağı inerse kod yolunun tanımsız sonuçlar verebileceği anlamına gelir. Yani dışlama şey parçacığı güvenli hale getirmek için kullanılabilir, ancak iş parçacığı güvenliği exclusive-- olmayan concurrent-- yürütme gerektirmez.
18'de bbum

17

Bu bağlantının kopması var

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

atamak __unsafe_untainedtained sahipliği ima eder.

kopya, __strong sahipliğinin yanı sıra kopya semantiğinin ayarlayıcıdaki olağan davranışını ifade eder.

korumak, güçlü sahiplik anlamına gelir.

güçlü, güçlü mülkiyeti ima eder.

güvensiz_unretained __unsafe_unretained sahipliğini ifade eder.

zayıf, __ zayıf sahiplik anlamına gelir.


Assign özelliği yalnızca iVar ve değerler için kullanılmıyor mu? Öyleyse neden güvensiz ve neden göz ardı edildiğine dikkat etmek gerekiyor?
mskw

9

Harika cevaplar! Daha derine açıklamak istiyorum bir şey olduğunu nonatomic/ atomic. Kullanıcı bu özelliğin - "atomisite" nin içeriğine değil, özniteliğin referansına yayıldığını anlamalıdır. Yani atomic, işaretçiyi ve yalnızca işaretçiye özelliğin okunması / ayarlanması için kullanıcının atomikliğini garanti eder. Örneğin:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

Bu durumda, göstericinin dictfarklı iplikler tarafından atomik şekilde okunacağı / ayarlanacağı garanti edilir . AMA dictkendisi ( dictişaret eden sözlük ) hala iş parçacığı güvensizdir , yani sözlüğe yapılan tüm okuma / ekleme işlemleri yine de iş parçacığı güvensizdir.

İplik güvenli koleksiyona ihtiyacınız varsa, ya kötü mimariye (daha sık) VEYA gerçek gereksinime (daha nadir) sahip olursunuz. "Gerçek gereksinim" ise - ya iyi ve test edilmiş iplik güvenli toplama bileşeni bulmak YA DA kendi bir yazma deneme ve sıkıntılar için hazırlıklı olun. Daha sonra "kilitsiz", "beklemesiz" paradigmalara bakalım. İlk bakışta roket bilimi gibi görünüyor, ancak "olağan kilitleme" ile karşılaştırıldığında harika bir performans elde etmenize yardımcı olabilir.

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.