一个人怎么会知道它的孩子已经自杀了

时间:2011-09-15 08:01:39

标签: iphone cocoa-touch

我有一个简单的问题:

View Controller X添加了一个子视图:View Controller Y.

Y有一个“退出”按钮。点击按钮时,它会从X的视图层次结构中删除其视图。

但是我发现Y的'viewDidUnload'方法没有被调用,并且它的内存无法释放。 Y怎么可能正确地释放自己,或者X怎么知道Y已经消失了?

我相信我可以制作一个协议并让Y从X调用一个方法,但我希望有一个更简单的方法。

4 个答案:

答案 0 :(得分:0)

所以你希望Y视图控制器在视图关闭时得到清理? 在iOS5之前,没有什么能够同时在屏幕上支持多个UIViewController,因此您基本上可以自己进行调用。 您可以在Y关闭时通知X(您可以使用NSNotificationCenter或委托),X会将Y的视图设置为nil,这将导致在其中调用viewDidUnload方法。 此外,您甚至可以释放Y视图控制器,如果您不打算再显示它,它将解除它所拥有的每个实例(以及视图本身)。

答案 1 :(得分:0)

通过编码...

在View Controller X中添加了View Controller Y.
    [viewX.view addSubView:viewY.view];

因此,viewDidLoad方法不会执行。并且,就内存管理而言,您可以在viewX.m中对其进行编码,即已经点击“退出”......

    [viewY removeFromSuperView];
    [viewY released];

答案 2 :(得分:0)

如果您只需要知道子视图何时从其父视图中删除,请实施didAddSubview:和/或willRemoveSubview:。 (See here in the documentation

如果要在删除视图时释放viewController,则需要...在删除视图时释放viewController:[viewController.view removeFromSuperview]; [viewController release]; viewController = nil;

viewDidUnload方法仅在iOS发出memoryWarning时调用,然后ViewController自动卸载其视图(如果它不在屏幕上,例如ViewController不是NavCtrl堆栈的最顶层)所以它的视图是不可见的)释放一些内存(然后将重新加载来自XIB的视图,并在需要重新加载视图以再次显示时调用viewDidLoad。)

答案 3 :(得分:0)

你不应该在屏幕上同时拥有2个UIViewControllers。存在与此相关的一系列问题,而不是如何使用它们。

单个UIViewController应该管理与单个屏幕关联的所有子视图。如果你想要一个“子”视图子类UIView并将其添加为子视图。

要允许在视图控制器之间轻松切换,请添加UINavigationController作为根视图控制器,并通过它推送/弹出视图控制器。然后,您可以非常轻松地更改屏幕。请记住 - 您可以关闭导航栏和/或动画,但没有视觉指示您的应用程序正在使用导航控制器,但完全受益于它能够管理一堆视图并确保将所有正确的通知发送到每个视图控制器当它加载/出现/消失/卸载时。

如果您习惯使用UINavigationController构建每个应用程序作为根视图控制器,事情变得非常简单。