我有一个视图控制器,其中有两种方法可以返回。
第一种情况是这样的:
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得到了解除分配,在后一种情况下,它永远不会被解除分配。很奇怪,我知道我不应该这么说,但似乎是内部泄漏。
在使用完成块解雇时,我是否保留了一些我不知道的内容? 感谢
答案 0 :(得分:0)
一个区别是完成块引用self
。这导致它至少保留到块发射之前。不可否认,之后它应该被释放。
尝试在块外部创建一个本地以保留[self navigationController]
,然后在块中使用该局部,这样就不会引用self
。
我还要指出,在-dismissAndShowVideosForRecordVC:
中你有一个参数和一个同名的本地。无所谓,但可能存在编译器错误。