2010-11-18 32 views
2

我创建的应用程序使用UITabBarController作为主要的导航形式,在我遇到一些问题之前从未做过此操作。UITabBarController在内存警告后解除分配视图

在四个选项卡中的两个选项卡上,视图控制器使用标准导航控制器持续钻取并浏览类别,然后浏览到项目中,类别和项目具有不少图像。

使用我的应用程序(跌到哪里使用的4倍320x460的图像滚动型的项目阶段),我得到的几分钟后..

Received memory warning. Level=1 

这就DEALLOCATE一切都该视图的的目前持有我UITabBarController,当我点击标签时,我只出现白色屏幕。

当使用图像时,我试图用..

UIImageView *imageView = [[[UIImageView alloc] init] autorelease]; 
[imageView setImage:[UIImage imageNamed:@"image"]]; 
[self.view addSubview:imageView]; 

..as尽量据我所知,这是“内存管理”,而应该正确的dealloc。

我相信内存问题仅仅是由于4个大图像被加载到内存中引起的,这是我的应用程序的一个要求。该标签的消失不是:/

任何想法/指导?

+0

我相信你误解viewDidLoad中和viewDidUnload的价值。此外,您应该始终以任何方式摆脱自动释放池并执行手动保留/释放计数管理。在你的情况下,它很容易:UIImageView * imageView = [[UIImageView alloc] init]; [imageView setImage:[UIImage imageNamed:@“image”]]; [self.view addSubview:imageView]; [imageView发布]; – 2010-11-18 17:03:52

回答

3

这是设计。当您的应用程序收到内存警告时,当前不可见的所有视图控制器都将卸载其视图。你必须为此做好准备。当用户重新打开卸载的选项卡时,视图控制器将重新加载视图,并再次调用-viewDidLoad,您应该在其中执行视图设置。

+0

谢谢你,当我知道答案的时候,很简单!谢谢你帮我看到树人的木头。 – Bongeh 2010-11-23 09:25:04

+0

如果视图是从XIB加载的呢?那么在之前调用viewDidLoad时可能分配的所有对象又如何?如果您重新执行所有这些分配,您将泄漏所有先前的实例。 – Oscar 2012-02-09 09:28:27

+0

@Oscar:NIB或不是没有区别。这个过程是完全一样的。为了不浪费或泄漏内存,您必须释放您在'viewDidUnload'方法中的'viewDidLoad'中分配/保留的所有内容。文档详细描述了这一点。 – 2012-02-09 11:04:26

1

奥列给了一个体面的解释。有一件事,如果你的屏幕外视图控制器的视图被卸载了,你应该在-loadView中重新设置它。 调用此方法来设置视图层次结构,然后调用-viewDidLoad以表示视图已准备就绪。 如果您在-viewDidLoad中实现它,您将加载一个空视图(UIViewController -loadView),然后替换(使用您的-viewDidLoad代码),导致闪烁。

一个甚至有关装入你的意见更详细的解释,请访问:http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/

+0

但是,如果屏幕从XIB加载,则不会覆盖loadView。 – Oscar 2012-03-06 19:11:34

相关问题