2

我有一个视图控制器,其中有两种方法可以返回。

第一个场景是这样的:

RecordVC-> 告诉Delegate- dismissRecordVC:>RecordVC解雇和解除分配

第二种情况是这样的:

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 被释放就好了。

第二种情况是这样触发的:

- (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

一个区别是完成块引用self. 这会导致它至少保留到块触发。诚然,在那之后它应该被释放。

尝试在块外部创建一个本地来保存[self navigationController],然后在块中使用该本地,这样就不会引用self.

我还要指出,-dismissAndShowVideosForRecordVC:你有一个参数和一个同名的本地。没关系,但可能存在编译器错误。

于 2012-04-12T01:18:47.080 回答