没有调用 Dealloc

Posted

技术标签:

【中文标题】没有调用 Dealloc【英文标题】:Dealloc not being called 【发布时间】:2012-04-12 00:47:56 【问题描述】:

我有一个视图控制器,其中有两种返回方式。

第一个场景是这样的:

RecordVC -> 将 Delegate 告知 dismissRecordVC:-> RecordVC 已解除并解除分配

第二种情况是这样的:

RecordVC -> 告诉 DelegatedismissAndShowVideosForRecordVC:-> 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

即使调用了 didDetermineState,也没有调用 didrangebeacons

角后端服务调用没有休息调用

如何实现:如果函数还没有被调用,做点啥?

调用加入时如何修复“终止调用而没有活动异常”

无法调用其类型缺少调用签名的表达式...没有兼容的调用签名