Viewcontroller Dealloc 方法永远不会被调用

Posted

技术标签:

【中文标题】Viewcontroller Dealloc 方法永远不会被调用【英文标题】:Viewcontroller Dealloc Method Never Gets Called 【发布时间】:2015-05-19 16:57:06 【问题描述】:

我知道有很多这样的问题。我都读了。我的问题很简单。

我从 xcode 文件>新项目>单视图应用程序创建了一个单视图应用程序。 然后我在情节提要中添加了第二个 uiviewcontroller 和一个名为 secondViewController 的新 viewcontroller 类。我将一个按钮拖动到主视图控制器,然后按 ctrl+拖动到情节提要上的 secondViewController。我在 secondViewController 中做了相反的事情。并且刚刚将带有 nslog 的 dealloc 函数添加到类文件中。我还添加了对 uibuttons 的弱引用

当视图改变时,每个视图控制器的 Dealloc 方法永远不会被调用。

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
- (void)viewDidLoad 
    [super viewDidLoad];
    NSLog(@"viewDidLoad 1");
        // Do any additional setup after loading the view, typically from a nib.


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (void)dealloc 
    NSLog(@"dealloc 1");

SeconViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (void)dealloc 
    NSLog(@"dealloc 2");


@end

ARC 已启用。

Zombies 似乎在 product>edit 方案中被禁用。我正在使用 xcode 6.2。在仪器分配屏幕内存在每次切换时都会增加。

什么问题,我没找到?

【问题讨论】:

视图控制器的 dealloc 仅在视图控制器关闭时调用。所以你的主视图控制器永远不会被释放。如果你有两个视图控制器,那么你就没有一个视图应用程序。如果你有按钮和两个视图控制器,你怎么能不接触初始代码?提供相关详细信息,否则没有人可以帮助您。 很好,但问题是什么?如果您要离开此视图控制器(弹出或关闭它)并且未调用其 dealloc,则您有一个保留周期和内存泄漏,您需要修复它。如果你不愿意谈具体的代码,你希望在这里得到什么样的帮助? 对不起,我会尽力的。我编辑了这个问题。 @rmaddy 【参考方案1】:

当对象(这里是它的 viewcontroller 对象)从内存中刷出时调用dealloc。但是在你的情况下,你必须从另一个展示视图控制器,这导致只调用 viewwilldisappear 和 diddisappear。

在故事板中,如果你想从内存中完全删除那些视图控制器,你应该调用 unwind segue

【讨论】:

非常感谢。它适用于 secondViewController。有没有办法让它适用于主视图控制器? 但是你为什么要这样做。因为你的应用中随时都会出现一个视图控制器。你能解释一下具体的场景吗? 其实我不需要。只是好奇 :) 再次感谢,救了我的命 我想我们不能这样做,因为它会一直在内存中。如果你想强制它,那么你可以尝试将 appdelegate 的窗口设置为 nil。没问题

以上是关于Viewcontroller Dealloc 方法永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

问题:viewController不会调用dealloc()不会销毁

基于视图的应用程序 - [window addSubview:viewController.view] 之后的 viewcontroller retainCount;

弹出视图在 [super dealloc] 处崩溃应用程序

iOS线程安全的全面剖析

iOS线程安全的全面剖析

dealloc方法