我有一个视图控制器,其中有两种方法可以返回。
第一个场景如下:
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 get被解除分配,而在后一种场景中,它从未被解除分配。奇怪,我知道我不该这么说,但好像是内部泄密。
在使用完成块进行解雇时,我是否保留了一些我不知道的东西?谢谢
发布于 2012-04-12 01:18:47
一个不同之处是,完成块引用self。这导致它至少被保留,直到块起火。无可否认,在那之后,它应该被释放。
尝试在块外部创建一个本地以保存[self navigationController],然后在块中使用该本地,这样就没有对self的引用。
我还将指出,在-dismissAndShowVideosForRecordVC:中,您有一个参数和一个同名的本地。应该不重要,但也许有一个编译器错误。
https://stackoverflow.com/questions/10115976
复制相似问题