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;