gpt4 book ai didi

objective-c - Dealloc 未被调用

转载 作者:行者123 更新时间:2023-11-28 17:34:51 24 4
gpt4 key购买 nike

我有一个 View Controller ,其中有两种返回方式。

第一个场景是这样的:

RecordVC -> 告诉 Delegate dismissRecordVC: -> RecordVC 被解散并释放

第二种情况是这样的:

RecordVC -> 告诉 Delegate dismissAndShowVideosForRecordVC: -> RecordVC 被解散并 VideosTVC 呈现但是 RecordVC 未被释放。

第一个场景是这样触发的:

- (IBAction)back:(id)sender {
if ([_chromaKeySessionManager isWriting]) {
[_chromaKeySessionManager cancelWriting];
}
[_chromaKeySessionManager stopRunning];
[delegate dismissRecordVC:self];
}

委托(delegate)方法 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 永远不会被释放。这里唯一的区别是我用完成 block 将其关闭并推送另一个 Controller 。

对我来说,在这两种情况下看起来完全相同(就保留/释放而言),除了在第一种情况下 RecordVC 被释放,而在后一种情况下它永远不会被释放。很奇怪,我知道我不应该这样说,但似乎是内部泄漏。

在使用完成 block 进行解雇时,是否有我不知道的保留内容?谢谢

最佳答案

一个区别是完成 block 引用了self。这导致它至少被保留直到 block 被触发。不可否认,在那之后它应该被释放。

尝试在 block 外部创建一个局部变量来保存 [self navigationController],然后在 block 中使用该局部变量,这样就没有对 self 的引用。

我还要指出,在 -dismissAndShowVideosForRecordVC: 中,您有一个参数和一个同名的局部变量。应该没关系,但可能存在编译器错误。

关于objective-c - Dealloc 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com