Dealloc不被称为

问题描述:

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

第一种情形是这样的:

RecordVC - >告诉DelegatedismissRecordVC: - >RecordVC解雇和重新分配

第二种情况是这样的:

RecordVC - >告诉DelegatedismissAndShowVideosForRecordVC: - >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得到的重新分配并且在后一种情况下它永远不会被释放。奇怪,我知道我不应该这样说,但似乎是内部泄漏。

有什么我保留,我不知道用完成块解雇的时候吗? 感谢

+0

dismissViewControllerAnimated是UIViewController的方法。看看这里:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html – 0xSina 2012-04-12 00:51:38

+0

在这种情况下,你的代码中的某个地方有一个VideoTVC被保留的引用(保留?)。 – 2012-04-12 00:53:43

+0

我真的需要检查吗?有两种情况,在一种情况下,它可以很好地解除分配,另一种情况是,你可以在那里看到,没有什么区别,没有引用被保留,但它从未被释放。但我会再次检查以确保 – 0xSina 2012-04-12 00:55:39

一个区别是,在完成块参照self。这会导致它至少被保留下来,直到火灾发生。无可否认,之后它应该被释放。

尝试创建块的本地外部以容纳[self navigationController],然后在该块中使用该局部因此没有提及self

我还要指出的是,在-dismissAndShowVideosForRecordVC:你有一个参数,并与同名的地方。应该不重要,但也许有编译器错误。

+1

我想到了这一点,但当我意识到自己不是被保留的东西时,停下了自己,它是呈现的视图控制器。 – borrrden 2012-04-12 01:21:12

+0

啊,好点。我失去了踪迹。 ;) – 2012-04-12 01:25:00

+0

感谢您的意见。好的调用,没有看到相同的变量名,所以改变了(但仍然没有区别)。为navController创建了一个局部块,没有区别.. :( – 0xSina 2012-04-12 01:29:18