首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确处理didReceiveMemoryWarning

正确处理didReceiveMemoryWarning
EN

Stack Overflow用户
提问于 2012-05-03 18:08:33
回答 2查看 5.8K关注 0票数 2

我的一个UIViewController有几个子视图控制器。它们是在接口构建器中构建的,方法是将一个NSObject拖到左侧的"Objects“部分,然后将其放入我自己的SpecialViewController中作为"Custom Class”。有了这个设置,在viewDidLoad上,我将准备好我的视图和控制器。工作流程由以下屏幕截图提供建议:

在我的实现中,我有:

代码语言:javascript
复制
@interface ParentController : UIViewController
{
     SpecialViewController *svc;
}
@property (nonatomic, retain) IBOutlet SpecialViewController *svc;

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

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

父控制器在didReceiveMemoryWarning中也只包含[super didReceiveMemoryWarning];。我在这两个类中都尝试过niling IBOutlets。这没什么用。

知道为什么会这样吗?

我的目标是iOS 4&5和ARC。SpecialViewControllerUITableViewController的一个子类。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-07 21:47:38

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

如果您正在尝试像UIViewController容器这样的东西,那么您可能应该查看涵盖此过程的WWDC主题。

票数 2
EN

Stack Overflow用户

发布于 2012-05-07 22:10:31

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

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

在实践中,我使用didReceiveMemoryWarning发布我的主视图(self.view),并使用viewDidUnload发布在viewDidLoad中创建的任何内容。我发现这些方法的名称和使用之间的平衡是很直观的。如果您在viewDidLoad中创建了某个内容,请在viewDidUnload中发布它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10429235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档