2

我的一个UIViewController有几个子视图控制器。它们是在界面构建器中构建的,通过将一个拖到NSObject左侧的“对象”部分,然后放入我自己SpecialViewController的“自定义类”中。通过此设置,viewDidLoad我将准备好视图和控制器。以下屏幕截图建议了工作流程:

拖

在我的实现中,我有:

@interface ParentController : UIViewController
{
     SpecialViewController *svc;
}
@property (nonatomic, retain) IBOutlet SpecialViewController *svc;

据我了解,在此期间didReceiveMemoryWarning我应该释放自己的资源。然后IBOutletsviewDidUnload.

我在模拟器中模拟低内存时崩溃,调试器在didReceiveMemoryWarningof SpecialViewController(其主体只是[super didReceiveMemoryWarning];)处暂停,并出现错误EXC_BAD_ACCESS (code=1, address=0xe0000008)。此时,父控制器是不可见的,因此可以安全地释放它。

父控制器也只包含[super didReceiveMemoryWarning];didReceiveMemoryWarning. 我IBOutlets在这两个课程中都尝试过 niling。它没有帮助。

知道为什么会这样吗?

我的目标是带有 ARC 的 iOS 4 和 5。SpecialViewController是 的子类UITableViewController

通过追踪,发现ParentController didReceiveMemoryWarning是之前调用的SpecialViewController

4

2 回答 2

2

似乎您在此处的视图控制器中有一个视图控制器。您选择创建这样的课程有什么特别的原因吗?根据我的经验,每个 UIViewController 都应该是一个单独的子类。基于您的错误出现在的事实didReceiveMemoryWarning,我认为问题出在其他地方。你能分享这个视图控制器的初始化代码吗?

如果您正在尝试 UIViewController Containment 之类的操作,您可能应该查看涵盖此过程的 WWDC 主题。

于 2012-05-07T13:47:38.073 回答
2

更新 iOS > 6.0:

在内存不足的情况下不再清除视图,因此永远不会调用此方法[1]


视图控制器的didReceiveMemoryWarning默认实现会释放它们的视图;您的责任只是发布在viewDidLoad或中创建的任何其他视图loadView,以及对 IBOutlet 子视图的任何强引用。

你对另一个视图控制器有一个强引用,当视图再次可见时,它不会被重新创建。您不应该使用didReceiveMemoryWarning释放您的sec实例变量;相反,依靠SpecialViewController'sdidReceiveMemoryWarning实现来处理释放它的视图。

在实践中,我didReceiveMemoryWarning用来发布我的主视图 ( self.view) 并viewDidUnload用来发布在viewDidLoad. 我发现方法名称及其用途的平衡很直观。如果您在 中创建某些内容,请在viewDidLoad中发布它viewDidUnload

于 2012-05-07T14:10:31.183 回答