[英]How to avoid retain cycle with delaying block invocation on iOS
我真的很難受這個。 我一直在閱讀有關如何正確處理塊內變量的所有信息。
注意:我沒有使用arc。
所以,假設我有一個看起來像這樣的動畫:
[UIView animateWithDuration:.5 animations:^{
textCard.alpha = 1.f;
self.dotView.alpha = 1.f;
self.subtitles.alpha = 0;
}completion:^(BOOL finished){
[self.playerLayer removeFromSuperlayer];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.vidPlayer];
self.playerLayer.frame = self.vidView.bounds;
[self.vidView.layer insertSublayer:self.playerLayer atIndex:0];
[self.subtitles removeFromSuperview];
self.subtitles = [sub autorelease];
[UIView animateWithDuration:.3 delay:1 options:UIViewAnimationOptionAllowUserInteraction animations:^{
textCard.alpha = 0.f;
sub.alpha = 1.f;
}completion:^(BOOL finished){
self.queuedVid = NO;
if (self.shouldPlay == YES) {
[self.vidPlayer play];
[self setCurrentVideoSettings];
}
else{
self.shouldPlay = YES;
}
[textCard removeFromSuperview];
textCard = nil;
}];
}];
現在這段代碼可能看起來有點武斷,但這是一個我必須做的事情的真實世界的例子。
這是我的兩個問題:
如果我保持原樣,並且在調用此塊期間類(嘗試)被取消分配,則不會釋放。
如果我把自己改為__block typeof (self) weakRef = self;
然后,如果在第二個塊可以運行之前該類被釋放,它會崩潰,因為它試圖引用我的deallocated self。
我知道我一定不能理解這是如何運作的,但如果有人能說出一些亮點,我將不勝感激。
您不必擔心在內聯動畫塊中通過引用self
創建的保留周期。 動畫開始時,塊將保留self,並在動畫塊完成執行時釋放它。
想象一下有人做了一些調用動畫的東西。 然后,在動畫完成之前,他們將該視圖控制器從導航堆棧中彈出。 導航控制器釋放您的控制器,但動畫塊繼續保留它。 當動畫完成時(屏幕外),該塊將釋放應該是控制器的最后一個引用,並且它將被釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.