Obj-C için yeniyim, bu yüzden ilk sorum:
Arasındaki farklar nelerdir strong
veweak
içinde @property
nesnelere işaretçiler beyanlarına?
Ayrıca ne anlama nonatomic
geliyor?
Obj-C için yeniyim, bu yüzden ilk sorum:
Arasındaki farklar nelerdir strong
veweak
içinde @property
nesnelere işaretçiler beyanlarına?
Ayrıca ne anlama nonatomic
geliyor?
Yanıtlar:
Güçlü bir başvuru (çoğu durumda kullanacağınız), bu özellik / değişkenle başvurduğunuz nesneye "sahip olmak" istediğiniz anlamına gelir. Derleyici, bu özelliğe atadığınız herhangi bir nesnenin, güçlü bir başvuru ile işaret ettiğiniz sürece yok edilmeyeceğine dikkat edecektir. Özelliği yalnızcanil
yalnızca nesneyi yok edecek şekilde (bir veya daha fazla nesne de ona güçlü bir başvuruda bulunmadıkça).
Buna karşılık, zayıf bir referansla, nesnenin ömrü üzerinde kontrol sahibi olmak istemediğinizi belirtirsiniz. Referansta bulunduğunuz nesne zayıf bir şekilde yaşıyor çünkü en az bir başka nesne ona güçlü bir referans veriyor. Artık böyle olmazsa, nesne yok edilir ve zayıf mülkünüz otomatik olarak ayarlanır nil
. İOS'ta zayıf referansların en sık kullanım durumları şunlardır:
koruma döngülerinden kaçınmak için genellikle zayıf referans verilen temsilci özellikleri ve
bir görünüm denetleyicisinin ana görünümünün alt görünümleri / kontrolleri, çünkü bu görünümler zaten ana görünüm tarafından tutulmaktadır.
atomik ve atomik olmayan, derleyicinin özellik için sentezlediği alıcı ve ayarlayıcı yöntemlerinin iplik güvenliğini ifade eder. atomic (varsayılan) derleyiciye erişimci yöntemlerini iş parçacığı için güvenli hale getirmesini (bir ivar'a erişmeden önce bir kilit ekleyerek) ve anatomik olmayanın tersini yapmasını söyler. Atomik olmayanın avantajı biraz daha yüksek performanstır. İOS'ta, Apple neredeyse tüm özellikleri için anatomik olmayan bir yöntem kullanır, bu nedenle genel tavsiye aynı şeyi yapmanızdır.
atomic
garanti eder . Bu, özelliklerinin tümü otomatik olarak iş parçacığı için güvenli olan bir nesne anlamına gelmez . atomic
Balonlar açısından güçlü ve zayıf referansları düşünmek faydalı olabilir.
En az bir kişi kendisine bağlı bir ipi tuttuğu sürece balon uçmayacaktır. Dizeleri tutan kişi sayısı alıkoyma sayısıdır. Hiç kimse bir ipte tutmadığında, balon uçar (dealloc). Birçok insan aynı balona dizeleri olabilir. Hem güçlü hem de zayıf referanslarla başvurulan nesne üzerindeki özellikleri ve çağrı yöntemlerini alabilir / ayarlayabilirsiniz.
Güçlü bir referans, o balona bir ipte tutunmaya benzer. Balona bağlı bir ipi tuttuğunuz sürece uçmaz.
Zayıf bir referans balona bakmak gibidir. Görebilir, özelliklerine erişebilir, yöntemlerini çağırabilirsiniz, ancak o balona hiçbir dize yoktur. Eğer ipi tutan herkes giderse, balon uçar ve artık ona erişemezsiniz.
strong
ve weak
aslında ne anlama geldiğini açıkça anladım .
strong : gelen değeri atar, gelen değeri korur ve örnek değişkeninin mevcut değerini serbest bırakır
zayıf : Gelen değeri tutmadan atar.
Temel fark yeni değişkenin korunmasıdır. Genellikle onu korumak istersiniz, ancak sahip olmak istemediğiniz durumlar vardır, aksi takdirde bir tutma döngüsü elde edersiniz ve nesneleri belleği serbest bırakamazsınız. Örneğin. obj1 obj2'yi ve obj2 obj1'i korur. Bu tür bir durumu çözmek için zayıf referanslar kullanırsınız.
Kukla bir cevap: -
Bence yukarıdaki cevapta açıklama verildi, bu yüzden size sadece nerede STRONG
ve nerede kullanılacağını anlatacağım WEAK
:
Kullanımı Weak
: -
1. Delegeler 2. Satış noktaları 3. Alt görünümler 4. Kontroller, vb.
Kullanımı Strong
: -
Dahil olmayan her yerde kalan WEAK
.
güçlü ve zayıf , bu anahtar kelimeler Objective-C Nesne Sahipliği etrafında döner
Nesne sahipliği nedir?
İşaretçi değişkenleri, işaret ettikleri nesnelerin sahipliğini ifade eder.
İşaretçi değişkeni bir nesneyi her işaret ettiğinde, o nesnenin bir sahibi olur ve hayatta kalır. Bu güçlü bir referans olarak bilinir .
Bir değişken isteğe bağlı olarak işaret ettiği bir nesnenin sahipliğini alamaz. Bir nesnenin sahipliğini almayan değişken zayıf başvuru olarak bilinir .
Burada ayrıntılı bir açıklama için bir göz atın Demystifying @property ve nitelikleri
Burada, Apple Belgeler çeşitli örneklerle zayıf ve güçlü mülkiyet arasındaki farkı izah etti:
Burada, bu blogda yazar tüm özellikleri aynı yerde topladı. Özellik özelliklerinin karşılaştırılmasına yardımcı olacaktır:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
strong varsayılan değerdir. Bir nesne, güçlü bir işaretçisi olduğu sürece “canlı” kalır.
zayıf başvurulan nesneyi canlı tutmayan bir başvuruyu belirtir. Nesneye güçlü referanslar olmadığında zayıf bir referans nil olarak ayarlanır.
Güçlü ve Zayıf referansı anlamak için aşağıdaki örneği düşünün, displayLocalVariable adında bir yöntemimiz olduğunu varsayalım.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
Yukarıdaki yöntemde, myView değişkeninin kapsamı displayLocalVariable yöntemiyle sınırlıdır, yöntem bittikten sonra UIView nesnesini tutan myView değişkeni bellekten çıkarılır.
Şimdi, myView değişkenini görünüm denetleyicimizin yaşam döngüsü boyunca tutmak istiyorsak. Bunun için , aşağıdaki gibi myView değişkenine ( @property(nonatomic,strong) UIView* usernameView;
ve self.usernameView = myView;
aşağıdaki koda bakınız) güçlü bir referansa sahip olacak usernameView adlı özelliği oluşturabiliriz ,
@interface LoginViewController ()
@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Şimdi yukarıdaki kodda myView'in self.usernameView'a atandığını ve self.usernameView öğesinin myView için güçlü bir referansa sahip olduğunu (@property kullanarak arayüzde bildirdiğimiz gibi) görebilirsiniz. Bu nedenle myView, self.usernameView canlanana kadar bellekten ayrılamaz.
Şimdi zayıf bir referans olan dummyNameView'a myName atamayı düşünün, self.dummyNameView = myView;
Güçlü referansın aksine Weak, myView'a yalnızca güçlü bir referans olana kadar tutacaktır. Zayıf referansı anlamak için aşağıdaki koda bakın,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
Yukarıdaki kodda myView'a zayıf referans var (yani self.dummyNameView, myView'a zayıf referansa sahip), ancak myView'a Güçlü bir referans yok, bu nedenle self.dummyNameView myView değerini tutamayacak.
Şimdi tekrar aşağıdaki kodu düşünün,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}
Yukarıdaki kodda self.usernameView, myView için güçlü bir referansa sahiptir, bu nedenle self.dummyNameView, myView kendisiyle ilişkili bir Güçlü referansa sahip olduğu için yöntem sona erdikten sonra bile myView değerine sahip olacaktır.
Şimdi, bir değişkene Güçlü bir referans yaptığımızda, tutma sayısı birer birer artırılır ve değişken tutma sayısı 0'a ulaşıncaya kadar değişken serbest bırakılmaz.
Bu yardımcı olur umarım.
Güçlü : Temelde Kullanılan Özellikler ile birlikte kullandık veya başka bir sınıfa veri gönderiyor veya başka sınıflara veri gönderiyoruz. Zayıf : Genellikle tüm çıkışlar, bağlantılar Arayüzden Zayıf tiptedir.
Nonatomik : Bu tür özellikler, çıkışımızı veya nesnesimizi farklı eşzamanlı İş Parçacıklarıyla paylaşmak istemediğimiz durumlarda kullanılır. Başka bir deyişle, Nonatomik örnek, her seferinde bir iş parçacığıyla başa çıkmak için özelliklerimizi yapar. Umarım sizin için yararlıdır.