@property Objective-C'de saklayın, atayın, kopyalayın, atom olmayan


214

Objective-C için yeni biri olarak birisi bana @property yönergesini izleyen alıkoyma, atama, kopyalama ve diğerlerini gözden geçirebilir mi? Ne yapıyorlar ve neden birini diğerinin üzerinde kullanmak isteyeyim?


1
Bunlar için Apple'ın adı "nitelikler" veya "özellik özellikleri" dir
nevan king

Yanıtlar:


273

MrMage tarafından bağlanan makale artık çalışmıyor. Yani, Objective-C kodlamada (çok) kısa süreli kodlamamda öğrendiklerim:

atomsuz ve atomik - "atomik" varsayılan değerdir. Her zaman "anatomik olmayan" kullanın. Nedenini bilmiyorum, ama okuduğum kitap "nadiren" atomik "kullanmak için bir neden" olduğunu söyledi. (BTW: Okuduğum kitap BNR "iOS Programlama" kitabı.)

readwrite - readonly - "readwrite" varsayılan değerdir. Synthesize ettiğinizde, hem alıcı hem de ayarlayıcı sizin için oluşturulur. "Salt okunur" kullanırsanız ayarlayıcı oluşturulmaz. Nesneyi somutlaştırdıktan sonra değiştirmek istemediğiniz bir değer için kullanın.

alıkoyarak kopyalamaya karşı ata

  • "ata" varsayılan ayardır. @Synthesize tarafından oluşturulan ayarlayıcıda, değer sadece özniteliğe atanacaktır. Anladığım kadarıyla "atama", işaretçi olmayan özellikler için kullanılmalıdır.
  • Öznitelik bir nesneye işaretçi olduğunda "koru" gereklidir. @Synthesize tarafından oluşturulan ayarlayıcı nesneyi alıkoyacaktır (diğer bir deyişle alıkoyma sayımı eklemek). İşiniz bittiğinde nesneyi bırakmanız gerekir.
  • Nesne değiştirilebilir olduğunda "kopya" gerekir. 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.

@Blamdarot - Ben de ARC ile serbest bırakmak gerekiyor mu
Dejell

10
@Odelya - Hayır. ARC kullanırken serbest bırakırsanız, derleyici hatası alacağınıza inanıyorum.
Blamdarot

52
"Daima anatomik olmayan kullanımı" kötü bir tavsiye. Atomik olmayan kullandığınızda neyi bıraktığınızı bilmelisiniz.
Jesse Rusak

7
Kabul. Özellikle, birçok insan anatomik olmayan değerlerin alıcı tarafından muhafaza edilmediğini bilmiyor gibi görünüyor. anatomik olmayan genellikle uygundur, ancak kargo kültünün programlanması nadiren yapılır.
Catfish_Man

9
Temerrütten çıkmayı tavsiye etmek, atomictavsiye etmek kadar kötüdür nonatomic. Her iki seçenek de "doğru" olanı değil, bu nedenle dil tasarımcıları iki çözümden daha güvenli olmayı seçti. Aslında nonatomic, son derece pahalı iplik kilitlerini atladığı için genellikle daha iyi bir seçimdir. Kullanmanın tek nedeni atomic, mülkünüzün birden fazla iş parçacığından ayarlanabilmesidir (bu durumda onu atlamak aşırı serbest bırakmaya veya sızıntıya neden olabilir).
Adam Kaplan

295

@Property'nin özelliklerini bilmeden önce, @property'nin kullanımının ne olduğunu bilmelisiniz.

  • @property , bir sınıfın kapsüllemek istediği bilgileri tanımlamanın bir yolunu sunar. Bir nesneyi / değişkeni @property kullanarak bildirirseniz, o nesneye / değişkene kendi sınıfını alan diğer sınıflar erişebilir.

  • Kullandığınız bir nesne bildirirseniz @property başlık dosyasında, o zaman kullanarak sentezlemek zorunda @synthesize uygulama dosyasında. Bu, nesne KVC'sini uyumlu hale getirir . Varsayılan olarak, derleyici bu nesne için erişimci yöntemlerini sentezleyecektir .

  • erişimci yöntemleri şunlardır: ayarlayıcı ve alıcı.

Örnek: .h

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

.m

@implementation XYZClass
@synthesize name;
@end

Şimdi derleyici isim için erişimci yöntemlerini sentezleyecektir .

XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
  • @Property özelliklerinin listesi

    atom, atom olmayan, tutma, kopya, salt okunur, yeniden yazma, ata, güçlü, alıcı = yöntem, ayarlayıcı = yöntem, güvenli olmayan

  • atomik varsayılan davranıştır. Bir nesne atomik olarak bildirilirse, iş parçacığı için güvenli hale gelir. İş parçacığı için güvenli anlamına gelir, bir seferde o sınıfın belirli bir örneğinin yalnızca bir iş parçacığı bu nesne üzerinde denetime sahip olabilir.

İş parçacığı alıcı yöntemini gerçekleştiriyorsa, diğer iş parçacığı bu nesne üzerinde ayarlayıcı yöntemini gerçekleştiremez. Bu yavaş.

@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
  • anatomik olmayan iplik için güvenli değildir. Otomatik olmayan özellik özniteliğini kullanarak, sentezlenmiş erişimcilerin bir değeri doğrudan ayarladığını veya doğrudan döndürdüğünü belirtebilirsiniz; bu, aynı değere farklı iş parçacıklarından aynı anda erişilirse ne olacağı konusunda hiçbir garanti vermez.

Bu nedenle, atomik olmayan bir özelliğe erişmek, atomik olandan daha hızlıdır.

@property (nonatomic)NSString *name;   
  • öznitelik bir nesneye işaretçi olduğunda saklama gerekir.

Setter yöntemi nesnenin alıkonma sayısını artıracak ve böylece otomatik kiralama havuzunda belleği kaplayacaktır.

@property (retain)NSString *name;
  • copy Kopya kullanırsanız, alıkoymayı kullanamazsınız. Sınıfın kopya örneğini kullanmak kendi kopyasını içerecektir.

Değişken bir dize ayarlanıp daha sonra değiştirilse bile, örnek, ayarlandığı sırada sahip olduğu değeri yakalar. Hiçbir ayarlayıcı ve alıcı yöntemi sentezlenmeyecektir.

@property (copy) NSString *name;

Şimdi,

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

adı etkilenmeyecektir.

  • readonly Özelliğin ayarlayıcı yöntemiyle değiştirilmesine izin vermek istemiyorsanız, özelliği salt okunur olarak bildirebilirsiniz.

Derleyici bir alıcı oluşturur, ancak ayarlayıcı oluşturmaz.

@property (readonly) NSString *name;
  • readwrite varsayılan davranıştır. Readwrite niteliğini açıkça belirtmenize gerek yoktur.

Salt okunurun tersidir.

@property (readwrite) NSString *name;
  • assign , değeri kopyalamak veya tutmak yerine, örnek değişkenine doğrudan atayan bir ayarlayıcı oluşturur. Bu, NSInteger ve CGFloat gibi ilkel türler veya doğrudan sahip olmadığınız temsilciler gibi nesneler için en iyisidir.

Çöp toplama etkinleştirildiğinde, alıkoyma ve atamanın temelde değiştirilebilir olduğunu unutmayın.

@property (assign) NSInteger year;
  • strong , tutmanın yerine geçer.

ARC ile birlikte geliyor.

@property (nonatomic, strong) AVPlayer *player; 
  • getter = method Bir alıcı yöntemi için farklı bir ad kullanmak istiyorsanız, özelliğe öznitelikler ekleyerek özel bir ad belirtmek mümkündür.

Boolean özellikleri (EVET veya HAYIR değeri olan özellikler) durumunda, getter yönteminin “is” kelimesiyle başlaması gelenekseldir.

@property (getter=isFinished) BOOL finished;
  • setter = method Bir ayarlayıcı yöntemi için farklı bir ad kullanmak isterseniz, özelliğe öznitelikler ekleyerek özel bir ad belirtmek mümkündür.

Yöntem iki nokta üst üste ile bitmelidir.

@property(setter = boolBool:) BOOL finished;
  • unsafe_unretained Kakao ve Kakao Dokunma'da henüz zayıf referansları desteklemeyen birkaç sınıf vardır, bu da onları takip etmek için zayıf bir mülk veya zayıf yerel değişken beyan edemeyeceğiniz anlamına gelir. Bu sınıflar NSTextView, NSFont ve NSColorSpace vb. Bu sınıflardan birine zayıf bir başvuru kullanmanız gerekiyorsa, güvenli olmayan bir başvuru kullanmalısınız.

Güvenli olmayan bir başvuru, ilgili nesnesini canlı tutmaması nedeniyle zayıf bir referansa benzer, ancak hedef nesne yeniden konumlandırılırsa nil olarak ayarlanmaz .

@property (unsafe_unretained) NSObject *unsafeProperty;

Birden çok özellik belirtmeniz gerekiyorsa, bunları virgülle ayrılmış bir liste olarak ekleyin, örneğin:

@property (readonly, getter=isFinished) BOOL finished;

Buna ek olarak, zayıf, nesneye başvurulan için bir başvuru sayısı olmadığı, ancak nesneye hiç başvurulduğu veya hiç başvurulmadığı anlamına gelir. Bir çeşit "evet, bir şey bana referans verdi" vs. "Bana 9 referans var" (güçlü olan şey budur).
Alex Zavatone

6
Çöp toplama Mac OS X'te kullanımdan kaldırıldığı ve Apple belgelerinde iOS'ta mevcut olmadığı için, çöp toplama ile ilgili yanıttaki satırı göz ardı edin .
Basil Bourque

4
"Not: Özellik atomisitesi bir nesnenin iş parçacığı güvenliği ile eş anlamlı değildir." - developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
adresinden

1
"Kullandığınız bir nesne bildirirseniz @propertybaşlık dosyasında, o zaman gerek o kullanarak sentezlemek @synthesizeuygulama dosyasında." Her zaman değil. Örneğin, "Varsayılan olarak bir readwriteözellik, derleyici tarafından tekrar otomatik olarak sentezlenecek bir örnek değişkeni tarafından desteklenir." Gönderen doc .
Franklin Yu

4
@liza Bu mükemmel bir cevap. Bu neden kabul edilen cevap değil. Şu anda kabul edilen cevaptan çok daha bilgili bir açıklama getiriyor. Bazen StackOverflow anlamıyorum?
Charles Robertson

149

Birçok makaleyi okuduktan 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, bu özellikleri bulabileceğiniz ayrıntılı makaleye bir bağlantı bulunmaktadır.

Burada en iyi cevapları veren herkese çok teşekkürler !!

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

İşte Makale Örnek Açıklama

  1. atom -Atomic, değişkene (statik tip) yalnızca bir iş parçacığı eriştiği anlamına gelir. -Atomik iplik korumalıdır. -Ama performansta yavaştır -Atomik varsayılan davranıştır -Harici olmayan bir ortamda (örneğin tutma / bırakma / otomatik çalıştırma kullanılırken) anatomik erişimciler, başka bir iş parçacığının doğru ayar / alma işlemine engel olmamasını sağlamak için bir kilit kullanır değeri. -it aslında bir anahtar kelime değildir.

Misal :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic -Nonatomic vasıta, çok sayıda iplik giriş değişkeni (dinamik tipi). -Nonatomik iplik güvenli değildir. -ama performans hızlıdır -Nototomik varsayılan davranış DEĞİLDİR, özellik özniteliğine otomatik olmayan bir anahtar kelime eklememiz gerekir. -it 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;

Açıklamak:

"Name" adında bir atomik dize özelliği olduğunu varsayalım ve A iş parçacığından [self setName: @ "A"] öğesini çağırırsanız, B iş parçacığından [self setName: @ "B"] öğesini arayın ve [self name] öğesini C ipi, daha sonra farklı bir diş üzerindeki tüm işlemler seri olarak gerçekleştirilecektir, yani bir iplik ayarlayıcı veya alıcıyı yürütüyorsa, diğer dişler bekleyecektir. Bu özellik "name" okuma / yazma güvenli hale getirir, ancak başka bir iş parçacığı D [name release] aynı anda çağırırsa, burada ayarlayıcı / alıcı çağrısı olmadığından bu işlem bir çökme üretebilir. Başka bir iş parçacığı aynı anda nesneye her tür ileti gönderebildiğinden, bir nesnenin okuma / yazma güvenli (ATOMIC) olduğu, ancak iş parçacığı için güvenli olmadığı anlamına gelir. Geliştirici, bu tür nesneler için iş parçacığı güvenliğini sağlamalıdır.

"Name" özelliği anatomik değilse, yukarıdaki örnekteki tüm iş parçacıkları - A, B, C ve D eşzamanlı olarak yürütülür ve öngörülemeyen herhangi bir sonuç üretir. Atomik durumda, önce A, B veya C'den biri yürütülür, ancak D yine de paralel olarak yürütülebilir.

  1. strong (iOS4 = koru) - "artık işaret etmedikçe bunu yığınta tut" diyor -başka bir deyişle "Ben sahibiyim, koru ile aynı şekilde iyi nişan almadan önce bunu halledemezsin" - Yalnızca nesneyi tutmanız gerektiğinde güçlü kullanırsınız. -Varsayılan olarak tüm örnek değişkenleri ve yerel değişkenler güçlü işaretçilerdir. -UIViewControllers (UI öğesinin ebeveynleri) için genellikle güçlü kullanırız. -ARC ile birlikte kullanılır ve temelde, 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. Strong anahtar kelimesini kullanmak, nesneye sahip olduğunuz anlamına gelir.

Misal:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;
  1. zayıf (iOS4 = güvensiz_güvenli değil) -it "başkası güçlü bir şekilde işaret ettiği sürece bunu koru" diyor - atama, tutma veya serbest bırakmayla aynı şey - "Zayıf" bir referans, saklanmadığınız bir referanstır. -Biz genellikle IBOutlets (UIViewController'ın Childs) için zayıf kullanırız. -zayıf bir başvuru, başvurulan nesneyi bir çöp toplayıcı tarafından toplanmaya karşı korumaz. -Zayıf esas olarak atanmamış bir mülktür. Nesne yeniden yerleştirildiğinde, zayıf işaretçi otomatik olarak sıfır değerine ayarlanır

Misal :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

BJ Homer sayesinde güçlü ve zayıf açıklama :

Nesnemizin bir köpek olduğunu ve köpeğin kaçmak istediğini (yeniden yerleştirilmek) hayal edin. Güçlü işaretçiler köpek tasması gibidir. Tasma köpeğe takılı olduğu sürece, köpek kaçmayacaktır. Beş kişi tasmalarını bir köpeğe (bir nesneye beş güçlü işaretçi) bağlarsa, o zaman beş tasma da ayrılana kadar köpek kaçmaz. Zayıf işaretçiler ise köpeğe işaret eden ve “Bak! Bir köpek!” Diyen küçük çocuklar gibidir. Köpek hala tasma üzerinde olduğu sürece, küçük çocuklar hala köpeği görebilir ve yine de işaret ederler. Tüm tasmalar ayrılır ayrılmaz, kaç tane çocuk işaret ettiğine bakılmaksızın köpek kaçar. Son güçlü işaretçi (tasma) artık bir nesneyi işaret etmez etmez, nesne yeniden yerleştirilir ve tüm zayıf işaretçiler sıfırlanır. Zayıf kullandığımızda? Zayıf kullanmak isteyeceğiniz tek zaman, döngüleri korumaktan kaçınmak istediğiniz zamandır (örneğin, ebeveyn çocuğu korur ve çocuk ebeveynini korur, böylece ikisi de serbest bırakılmaz).

  1. retain = strong -it korunur, eski değer serbest bırakılır ve atanır -retain yeni değerin gönderilmesi gerektiğini belirtir - atamada sakla ve -release -retain adlı eski değer güçlü ile aynıdır. -apple, yazarsanız, otomatik olarak dönüştürüleceğini / yalnızca güçlü gibi çalışacağını söylüyor. - "ayır" gibi yöntemler örtük bir "koru" içerir

Misal:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. assign -assign varsayılan değerdir ve basitçe değişken atama gerçekleştirir -assign, derleyiciye özelliğin ayarlayıcı uygulamasının nasıl sentezleneceğini söyleyen bir özellik özniteliğidir.

Misal:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. unsafe_unretained

    -unsafe_unretained, ARC'ye alıkoyma / bırakma çağrılarının nasıl ekleneceğini söyleyen bir sahiplik niteleyicisidir. -unsafe_unretained, atamanın ARC sürümüdür.

Misal:

@property (nonatomic, unsafe_unretained) NSString *nickName;

@synthesize nickName;
  1. nesne değiştirilebilir olduğunda copy -copy gereklidir. -copy, yeni değerin gönderilmesi gerektiğini belirtir -devletme sırasındaki kopya ve -release adlı eski değeri gönderir. -copy, retain, çöp toplamayan ortamlarda açıkça bırakmanız gereken (örneğin, dealloc içinde) bir nesneyi döndürür. -Kopyayı kullanırsanız, bunu yine de dealloc içinde bırakmanız gerekir. - 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.

Misal:

@property (nonatomic, copy) NSArray *myArray;

@synthesize myArray;

2
Bence arktan sonra, tutma artık kullanılmıyor.
mert

1
tam liste 2 seçenek öğesini kaçırır: ayarlayıcı ve alıcı, aynı zamanda tek seçenek argüman gerektirir.
Scott Chu

strong veya retain, yalnızca nesne türü için varsayılan değerdir. İlkel tipler için kullanılamaz.
Saleh Enam Shohag

9

Atomik özelliğe aynı anda yalnızca bir iş parçacığıyla erişilebilir. Öyle parçacığı güvenli . Varsayılan atomiktir. Lütfen atomik anahtar kelime olmadığını unutmayın

Nonatomic vasıta madde It erişebilir çoklu iş parçacığı olan iplik güvensiz

Bu yüzden atom kullanırken çok dikkatli olmalısınız. Kodunuzun performansını etkilediğinden


3
"Not: Özellik atomisitesi bir nesnenin iş parçacığı güvenliği ile eş anlamlı değildir." from developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
jk7

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.