私はこれに本当に困惑しています。ブロック内の変数を適切に処理する方法について手に入れることができるすべての情報を読んでいます。
注:私はアークを使用していません。
したがって、次のようなアニメーションがあるとします。
[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;
}];
}];
このコードはおそらく少し恣意的に見えますが、これは私がしなければならないことの非常に現実的な例です。
これが私の2つの問題です。
これをそのままにして、このブロックの呼び出し中にクラスの割り当てを解除しようとすると、解放されません。
自分自身を
__block typeof (self) weakRef = self;
thenに変更すると、2番目のブロックを実行する前にクラスの割り当てが解除されると、割り当て解除された自分自身を参照しようとしているため、クラッシュします。
私はこれがどのように機能するかを理解してはいけないことを知っていますが、誰かが光を当てることができれば、私はそれをいただければ幸いです。