没有调用 Dealloc
Posted
技术标签:
【中文标题】没有调用 Dealloc【英文标题】:Dealloc not being called 【发布时间】:2012-04-12 00:47:56 【问题描述】:我有一个视图控制器,其中有两种返回方式。
第一个场景是这样的:
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 被释放,而在后一种情况下它永远不会被释放。很奇怪,我知道我不应该这么说,但似乎是内部泄漏。
在使用完成块解散时,是否有一些我不知道的保留? 谢谢
【问题讨论】:
dismissViewControllerAnimated 是 UIViewController 的方法。在这里查看:developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/… 在这种情况下,您的代码中某处有一个 VideoTVC 的引用被保留(保留?)。 我真的需要检查吗?有两种情况,一种是很好地解除分配,另一种是,正如您在那里看到的那样,没有太大区别,没有保留引用,但它神奇地永远不会被解除分配。但我会再次检查以确保 另外,VideoTVC 与它无关。涉及 3 个视图控制器(第一个场景中有 2 个)。 RecordVC 调用 Delegate 关闭自己,Delegate 关闭 RecordVC,在第二种情况下,Delegate 在关闭 RecordVC 后推送 VideosTVC。 更新了我的问题以更清楚 【参考方案1】:一个区别是完成块引用self
。这会导致它至少保留到块触发。诚然,在那之后它应该被释放。
尝试在块外部创建一个本地来保存[self navigationController]
,然后在块中使用该本地,这样就不会引用self
。
我还要指出,在-dismissAndShowVideosForRecordVC:
中有一个参数和一个同名的局部变量。没关系,但可能存在编译器错误。
【讨论】:
我想到了这一点,但当我意识到 self 不是被保留的东西,它是呈现的视图控制器时,我停了下来。 感谢您的意见。好的调用,没有看到相同的变量名,所以改变了(但仍然没有区别)。为 navController 创建了一个本地块外部,没有区别.. :( 好的,是时候使用适当的分析工具了:仪器和分配仪器。在此条件下运行您的应用程序,引发在应该释放的情况下未释放某些内容的情况,然后跟踪其上的所有保留和释放。以上是关于没有调用 Dealloc的主要内容,如果未能解决你的问题,请参考以下文章
为啥没有调用 didDeselectRowAtIndexPath