正确处理didReceiveMemoryWarning

时间:2012-05-03 10:08:33

标签: iphone objective-c ios cocoa-touch memory-management

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

Drag "Object" to create instance

在我的实施中,我有:

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

据我了解,在didReceiveMemoryWarning期间,我应该释放自己的资源。然后在IBOutlets期间将viewDidUnload设置为nil。

我在模拟器中模拟低内存时遇到崩溃,调试器暂停didReceiveMemoryWarning SpecialViewController(其正文仅为[super didReceiveMemoryWarning];),错误为EXC_BAD_ACCESS (code=1, address=0xe0000008)。此时,父控制器不可见,因此可以安全地释放它。

父控制器在[super didReceiveMemoryWarning];中仅包含didReceiveMemoryWarning。我已经尝试在两个类中弄乱IBOutlets。它没有帮助。

知道为什么会这样吗?

我的目标是iOS 4& 5用ARC。 SpecialViewControllerUITableViewController的子类。

通过跟踪,我发现在ParentController didReceiveMemoryWarning之前调用SpecialViewController

2 个答案:

答案 0 :(得分:2)

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

如果你正在尝试像UIViewController Containment这样的东西,你应该查看涵盖这个过程的WWDC主题。

答案 1 :(得分:2)

查看控制器的didReceiveMemoryWarning默认实现将释放他们的视图;您的责任仅是发布在viewDidLoadloadView中创建的任何其他观看次数,以及对IBOutlet子视图的任何强有力的引用。

您有另一个视图控制器的强引用,当视图再次可见时,将不会重新创建。您应使用didReceiveMemoryWarning来释放sec实例变量;相反,依靠SpecialViewController的{​​{1}}实现来处理释放它的观点。

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