1

私はこれに本当に困惑しています。ブロック内の変数を適切に処理する方法について手に入れることができるすべての情報を読んでいます。

注:私はアークを使用していません。

したがって、次のようなアニメーションがあるとします。

[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つの問題です。

  1. これをそのままにして、このブロックの呼び出し中にクラスの割り当てを解除しようとすると、解放されません。

  2. 自分自身を __block typeof (self) weakRef = self;thenに変更すると、2番目のブロックを実行する前にクラスの割り当てが解除されると、割り当て解除された自分自身を参照しようとしているため、クラッシュします。

私はこれがどのように機能するかを理解してはいけないことを知っていますが、誰かが光を当てることができれば、私はそれをいただければ幸いです。

4

1 に答える 1

3

selfインラインアニメーションブロック内のへの参照によって作成された保持サイクルについて心配する必要はありません。ブロックは、アニメーションの開始時に自己を保持し、アニメーションブロックの実行が終了すると解放されます。

誰かがあなたのアニメーションを呼び出す何かをすることを想像してみてください。次に、アニメーションが完了する前に、そのViewControllerをナビゲーションスタックからポップします。ナビゲーションコントローラーはコントローラーを解放しますが、アニメーションブロックはコントローラーを保持し続けます。アニメーションが完了すると(画面外)、ブロックはコントローラーへの最後の参照となるはずのものを解放し、割り当てが解除されます。

于 2013-03-19T16:12:09.810 に答える