Objective-C'de güçlü ve zayıf arasındaki farklar


308

Obj-C için yeniyim, bu yüzden ilk sorum:

Arasındaki farklar nelerdir strongveweak içinde @propertynesnelere işaretçiler beyanlarına?

Ayrıca ne anlama nonatomicgeliyor?


19
aslında bu iyi bir soru, bazen, güçlü / zayıf ve atomik / atomik olmayan tercihlerin temel kavramını unuttuk .... :) Bize bunu hatırlattığınız için teşekkür ederiz ...
andikurnia

10
@JackyBoy Komik olan, google'da önerilen basit aramanın beni buraya götürmesidir. #circularreference
Jason Renaldo

10
Google'daki cevapların çoğuna güvenmeme eğilimindeyim, ancak akıllı yanıtlar için her zaman
SO'ya başvuruyorum

Yanıtlar:


642

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:

  1. koruma döngülerinden kaçınmak için genellikle zayıf referans verilen temsilci özellikleri ve

  2. 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.


28
@Bourne: Bu, iplik güvenliği ile ne demek istediğinize bağlıdır. mülkiyetin aynı anda birkaç iş parçacığından güvenle okunup yazılabileceğini atomicgaranti eder . Bu, özelliklerinin tümü otomatik olarak iş parçacığı için güvenli olan bir nesne anlamına gelmez . atomic
Ole Begemann

3
Harika detaylar. Sanırım şimdiye kadar gerçekten anlamadım. Teşekkür ederim.
ahmedalkaff

1
Elma belgelerine göre, atomik ve atomik olmayan iplik güvenliği ile eşanlamlı olmalıdır. developer.apple.com/library/ios/documentation/cocoa/conceptual/…
Murtaza Khursheed Hussain

5
"Not: Özellik atomisitesi bir nesnenin iş parçacığı güvenliği ile eş anlamlı değildir." developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS

neden istemediğimiz zaman örneği silmiyoruz? Neden havayı balondan çıkartamıyoruz ya da istemediğimiz zaman yok edemiyoruz, neden bağlı ipleri önemsemeliyiz? Sadece verilere ihtiyacımız var.
Ashish Pisey

707

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.


68
+2 (eğer yapabilseydim). Cidden, gerçekten yaratıcı bir açıklama!
Con Antonakos

25
İOS'un gelişmesinden bir buçuk yıl sonra, şimdi ne olduğunu strongve weakaslında ne anlama geldiğini açıkça anladım .
Isuru

17
@ X.Li Tutma döngüsü, ballon için 2 dizginiz olduğu gibi, bunlardan biri size aittir (bu yüzden bu ballonun sahibi sizsiniz), diğeri de ballonun sahibi (yani bu balonun sahibi sizsiniz). İpinize sadece erişiminiz olduğundan, balon gitmek istemiyorsa ballonun gitmesine nasıl izin verirsiniz? Bu yüzden, ballonun sahibi olmanız daha iyidir (güçlü), ballon size sahip değilse (zayıf). Gitmesine izin vermek istediğinizde, sadece ipi kesin :)
snakeninny

5
Profilini oku, o bir iOS eğitmeni. Çok yaratıcı açıklama !! Hats Off :)
Hemang

3
Atomik ve atomik olmayan bence birden fazla kapılı, merkezde bir tuvaletli umumi tuvalet odası olarak tanımlanabilir. Birisi bir kapıdan tuvalete girdiğinde, gariplik anını yaşamak istemiyorsa, diğer tüm kapıları tuvalete kilitleyebilir. Lol. Bu saçmalık benzetmesini okuduğunuz için teşekkür ederiz.
Chen Li Yong

24

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.


12

Kukla bir cevap: -

Bence yukarıdaki cevapta açıklama verildi, bu yüzden size sadece nerede STRONGve 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.


2
Ve neleri içerir: P
Rajneesh071

3
webView, mapView, vb
shubham mishra

4
aslında film şeridinde sürükleyip bıraktığımız alt görüntülerin çoğu
shubham mishra

8

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.

  • Bir yöntem (veya işlev) bir nesneye işaret eden yerel bir değişkene sahip olduğunda, bu değişkenin işaret edilen nesneye sahip olduğu söylenir.
  • Bir nesnenin başka bir nesneye işaret eden bir örnek değişkeni olduğunda, işaretçiye sahip nesnenin, işaretlenen nesneye sahip olduğu söylenir.

İş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


6

Burada, Apple Belgeler çeşitli örneklerle zayıf ve güçlü mülkiyet arasındaki farkı izah etti:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

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


6

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.


2

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.

  • Zayıf referans

Ş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.


2019-07-25 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] Benim adım = ABC 2019-07-25 12: 33: 15.479226 + 0530 StrongAndWeak [6329: 245483] Benim adım güçlü = ABC 2019- 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [6329: 245483] İsmim zayıf = ABC için bu zayıf özellik myname değerine sahip olmadığını söyledi. Ama her iki referans için ABC olarak myname değeri alıyorum .. ..? daha net bir cevap verebilir misiniz ... Teşekkür peşin
Madhu_Nani

@Raviteja_DevObal ARC hemen yapmaya söz vermez (yani, dizeyi @ "ABC" olarak
ayırın

@Raviteja_DevObal As Açıklamak burada dizeleri bunun için kötü bir örnek. Cevabımı UIView nesnesi ile güncelledim, umarım yardımcı olur.
Mahadev Mandale

1

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.

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.