ARC

9

'daki ivar bloğunda __block öz referans döngüsü Bir blok ivarda görünür bir referans döngüsüne sahip bir kodum var. Aşağıdaki kod, bir referans döngüsü neden olur ve dealloc asla denir:ARC

__block MyViewController *blockSelf = self; 

loggedInCallback = ^(BOOL success, NSError *error){ 
    if (success) 
    { 
     double delayInSeconds = 1.0; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void) 
     { 
      [blockSelf.delegate loginDidFinish]; 
     });    
    } 
}; 

Ancak, yakalama için bloğun kapsam için benim temsilci başvuru tutmak için başka __block değişken oluşturmak eğer referans döngüsü uzağa gider:

__block id <MyViewControllerDelegate> blockDelegate = self.delegate; 

loggedInCallback = ^(BOOL success, NSError *error){ 
    if (success) 
    { 
     double delayInSeconds = 1.0; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void) 
     { 
      [blockDelegate loginDidFinish]; 
     });    
    } 
}; 

Sadece burada neler olduğunu anlamak istiyorum.

cevap

16

Burada ARC'yi kullanarak varlığınızı kabul edeceğim. ARC'den önce, ilk örneğiniz işe yarayacaktı. ARC ile __block'un semantiği değişmiştir. __block beyanları artık zayıftan ziyade güçlü bir şekilde ele geçirildi. İlk örnekleminizde __block'u __weak ile değiştirin ve hepsi beklendiği gibi çalışmalıdır.

İkinci örneğin neyin işe yaradığı ile ilgili olarak, temsilci için güçlü bir başvuru oluşturuyorsunuz, ancak bunun sizin nesnenize bir başvurusu yok. Böylece döngü yok ve herkes mutlu.

Özellikle blok yakalama etrafında, ARC yapılan değişikliklere Mike Ash'in makale okuma tavsiye ve __weakhttp://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html

+0

Mükemmel, teşekkürler! Sorumluluğun daha açıklayıcı olması için başlığımı güncelledim. –

+1

iOS 4.3'ü hedefliyorum, bunun yerine '' __unsafe_unretained'' kullanmak zorunda kaldım, ama işe yarıyor! –