2

私はView Controllerを持っています.2つの方法で戻ることができます.

最初のシナリオは次のようになります。

RecordVCDelegate->に伝えるdismissRecordVC:->RecordVC解雇および割り当て解除

2 番目のシナリオは次のようになります。

RecordVC-> 伝えますDelegate- dismissAndShowVideosForRecordVC:>RecordVC却下され、VideosTVC提示されますが、割り当て RecordVCは解除されません。

最初のシナリオは次のようにトリガーされます。

- (IBAction)back:(id)sender {
    if ([_chromaKeySessionManager isWriting]) {
        [_chromaKeySessionManager cancelWriting];
    }
    [_chromaKeySessionManager stopRunning];
    [delegate dismissRecordVC:self];
}

デリゲート メソッドdismissRecordVC:は次のとおりです。

- (void)dismissRecordVC:(RecordVC *)vc {
    [self dismissModalViewControllerAnimated:YES];
}

このback:方法を使用すると、RecordVC の割り当てが問題なく解除されます。

2 番目のシナリオは次のようにトリガーされます。

- (IBAction)goToVideos {
    if ([_chromaKeySessionManager isWriting]) {
        [_chromaKeySessionManager cancelWriting];
    }
    [_chromaKeySessionManager stopRunning];
    [delegate dismissAndShowVideosForRecordVC:self];
}

およびデリゲートのdismissAndShowVideosForRecordVC:メソッド:

- (void)dismissAndShowVideosForRecordVC:(RecordVC *)vc {
    [self dismissViewControllerAnimated:YES completion:^{
        VideosTVC *vc = [[VideosTVC alloc] init];
        [[self navigationController] pushViewController:vc animated:YES];
        [vc release];    
    }];
}

したがって、この場合、RecordVC の割り当てが解除されることはありません。ここでの唯一の違いは、完了ブロックでそれを却下し、別のコントローラーをプッシュしていることです。

私には、どちらのシナリオでも (保持/解放に関する限り) まったく同じように見えますが、最初のシナリオでは RecordVC の割り当てが解除され、後者のシナリオでは割り当てが解除されることはありません。奇妙で、これを言うべきではないことはわかっていますが、内部リークのようです.

閉じるために完了ブロックを使用するときに気付いていないことを保持していますか? ありがとう

4

1 に答える 1

1

1 つの違いは、完了ブロックが を参照することselfです。これにより、少なくともブロックが発火するまで保持されます。確かに、その後、それは解放されるべきです。

保持するブロックの外側にローカルを作成してから、ブロック[self navigationController]内でそのローカルを使用して、への参照がないようにしてselfください。

-dismissAndShowVideosForRecordVC:また、同じ名前のパラメーターとローカルがあることも指摘します。問題ではありませんが、コンパイラのバグがある可能性があります。

于 2012-04-12T01:18:47.080 に答える