Dealloc不被称为
问题描述:
我有一个视图控制器,其中有两种方法可以返回。Dealloc不被称为
第一种情形是这样的:
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得到的重新分配并且在后一种情况下它永远不会被释放。奇怪,我知道我不应该这样说,但似乎是内部泄漏。
有什么我保留,我不知道用完成块解雇的时候吗? 感谢
答
一个区别是,在完成块参照self
。这会导致它至少被保留下来,直到火灾发生。无可否认,之后它应该被释放。
尝试创建块的本地外部以容纳[self navigationController]
,然后在该块中使用该局部因此没有提及self
。
我还要指出的是,在-dismissAndShowVideosForRecordVC:
你有一个参数,并与同名的地方。应该不重要,但也许有编译器错误。
dismissViewControllerAnimated是UIViewController的方法。看看这里:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html – 0xSina 2012-04-12 00:51:38
在这种情况下,你的代码中的某个地方有一个VideoTVC被保留的引用(保留?)。 – 2012-04-12 00:53:43
我真的需要检查吗?有两种情况,在一种情况下,它可以很好地解除分配,另一种情况是,你可以在那里看到,没有什么区别,没有引用被保留,但它从未被释放。但我会再次检查以确保 – 0xSina 2012-04-12 00:55:39