Dealloc没被召唤

时间:2012-04-12 00:47:57

标签: objective-c ios cocoa-touch memory-management

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

第一种情况是这样的:

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得到了解除分配,在后一种情况下,它永远不会被解除分配。很奇怪,我知道我不应该这么说,但似乎是内部泄漏。

在使用完成块解雇时,我是否保留了一些我不知道的内容? 感谢

1 个答案:

答案 0 :(得分:0)

一个区别是完成块引用self。这导致它至少保留到块发射之前。不可否认,之后它应该被释放。

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

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