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?
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?
Yanıtlar:
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
atomic
tavsiye 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).
@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`
Bu nedenle, atomik olmayan bir özelliğe erişmek, atomik olandan daha hızlıdır.
@property (nonatomic)NSString *name;
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;
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.
Derleyici bir alıcı oluşturur, ancak ayarlayıcı oluşturmaz.
@property (readonly) NSString *name;
Salt okunurun tersidir.
@property (readwrite) NSString *name;
Çöp toplama etkinleştirildiğinde, alıkoyma ve atamanın temelde değiştirilebilir olduğunu unutmayın.
@property (assign) NSInteger year;
ARC ile birlikte geliyor.
@property (nonatomic, strong) AVPlayer *player;
Boolean özellikleri (EVET veya HAYIR değeri olan özellikler) durumunda, getter yönteminin “is” kelimesiyle başlaması gelenekseldir.
@property (getter=isFinished) BOOL finished;
Yöntem iki nokta üst üste ile bitmelidir.
@property(setter = boolBool:) BOOL finished;
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;
@property
başlık dosyasında, o zaman gerek o kullanarak sentezlemek @synthesize
uygulama 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 .
Birçok makaleyi okuduktan sonra tüm özellik bilgilerini bir araya getirmeye karar verdim:
- atomik // varsayılan
- nonatomic
- strong = koru // varsayılan
- zayıf = güvenli olmayan
- tutmak
- ata // varsayılan
- unsafe_unretained
- kopya
- Sadece oku
- 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 !!
İşte Makale Örnek Açıklama
Misal :
@property (retain) NSString *name;
@synthesize name;
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.
Misal:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
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).
Misal:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Misal:
@property (nonatomic, assign) NSString *address;
@synthesize address;
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;
Misal:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
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
iOS'ta obj-c'deki özellikler hakkındaki bu bağlantıları tercih edin ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html