11

Aşağıda verilen UIAnimation Block'larda __weak self'i kullanmalı mıyız? Kendini zayıf olarak belirtmiyorsak, koruma döngüsü sorunu yaratacağı mı? Aşağıdaki senaryoda da karıştırıldım. Bu konuda bir fikrin var mı? lütfen yorumlarınızı paylaşın.ARC'de UIAnimationBlocks içinde __weak self kullanmamız mı gerekiyor?

[self.navController dismissViewControllerAnimated:animated 
             completion:^{ 
                 [self doSomething]; 
                }]; 

Zayıf benlik kullanmalı mıyız?

+0

Teşekkürler beyler, daha açık ve netleşiyorum. Aşağıdaki durumu da tartışmak istiyorum. [self.navController dismissViewControllerAnimated: animasyon tamamlanma:^{ [self doSomething]; }]; –

cevap

23

Bu, tutma döngüsü değildir. animasyon sona erdiğinde blok Serbest bırakılıyor - A muhafaza döngüsü tutan birinci geçicidir nereye

animation framework -> block 
block -> self 

var Bu durumda

self -> block -> self 

olurdu. Bir tutma döngüsü gerçekleşse bile, bu yalnızca geçici olacaktır ve nesnenin ayrılmasını önlemez.

+0

Aşağıdaki durum nedir? (^ AnimateBlock) (void) =^(void) { [self doSomething]; }; –

+0

@ arango_86 Sorunuzda yazdığınız aynı durumdur. Bir tutma döngüsü oluşturmak için, önce nesnenizde bir özellik oluşturmanız gerekir, ör. @ @ mülkiyeti (nonatomic, copy) void (^ animateBlock) (void) 've sonra ona atamak self.animationBlock =^(void) {[self doSomething]; }; '. – Sulthan

+0

Zayıf özün animasyon içinde kullanılması hâlâ iyidir, böylece görüntü denetleyicinin görünümü dışına çıktığında serbest kalmasını engellemez - ve görüntü denetleyicisi artık görünmediğinde animasyonu yürütmek anlamlı değildir. – Boon

1

Hayır, bir koruma döngüsü oluşturmaz; çünkü blok (kapatma) self'a bağlı değildir.
Daha fazla bilgi için lütfen Apple'ın Automatic Reference Counting adresine bakın.

2

Döngü mümkün olduğunda, __weak'u kullanmanız gerekir. Bu durumda, , değil, çünkü animasyon bloğu kendiliğinden korunmuyor.

__weak numaralı başka bir durum, tamamlandıktan sonra bloğumuzu arayacak ve bu eylem sırasında self ayrılabilir. Örneğin, bazı ağ istekleri, tamamlama bloğunda görüntüleme denetleyicimiz için arayüz güncellemesini çağırır. Kullanıcı istek sırasında ekrandan çıkabilir. Bu durumda, bir blok ile self tutmaya gerek yok, zayıf kendini kullanmak daha iyidir. Ancak animasyon bloklarını kullanarak bu durum değil.

İlgili konular