Iphone UITabBarController内存警告后解除分配视图

Iphone UITabBarController内存警告后解除分配视图,iphone,objective-c,memory-management,uitabbarcontroller,Iphone,Objective C,Memory Management,Uitabbarcontroller,我正在创建一个应用程序,使用uitabarcontroller作为导航的主要形式,以前从未这样做过,我遇到过一点问题 在四个选项卡中的两个选项卡上,持有的视图控制器使用标准导航控制器向下钻取,浏览类别,然后进入项目,类别和项目有相当多的图像 使用我的应用程序几分钟后(一直到使用4个320x460图像的滚动视图的项目阶段),我得到 这就是当前保存在我的UITabBarController中的所有视图,当我单击选项卡时,我只看到白色屏幕 在使用图像时,我尝试使用 UIImageView *image

我正在创建一个应用程序,使用uitabarcontroller作为导航的主要形式,以前从未这样做过,我遇到过一点问题

在四个选项卡中的两个选项卡上,持有的视图控制器使用标准导航控制器向下钻取,浏览类别,然后进入项目,类别和项目有相当多的图像

使用我的应用程序几分钟后(一直到使用4个320x460图像的滚动视图的项目阶段),我得到

这就是当前保存在我的UITabBarController中的所有视图,当我单击选项卡时,我只看到白色屏幕

在使用图像时,我尝试使用

UIImageView *imageView = [[[UIImageView alloc] init] autorelease];
[imageView setImage:[UIImage imageNamed:@"image"]];
[self.view addSubview:imageView];
…据我所知,这是“内存管理”,应该尽可能正确地解除锁定

我认为内存问题仅仅是因为4个大图像被加载到内存中,这是我的应用程序的一个要求。选项卡的消失不是:/


有什么想法/指导吗?

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

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


关于加载视图,这里有一个更详细的解释:

我相信您误解了viewDidLoad和viewDidUnload的价值。此外,您应该始终以任何方式摆脱自动释放池,并进行手动保留/释放计数管理。在您的例子中,这相当简单:UIImageView*imageView=[[UIImageView alloc]init];[imageView setImage:[UIImage ImageName:@“image”];[self.view addSubview:imageView];[图像视图发布];谢谢你,当我知道答案时,很简单!,谢谢你帮我从树上的人那里看到了木头。如果视图是从XIB加载的呢?那么您在上一次调用viewDidLoad时分配的所有对象呢?如果您执行所有这些分配,您将泄漏以前的所有实例。@Oscar:NIB与否没有关系。过程完全相同。为了不浪费或泄漏内存,必须在
viewDidUnload
方法中释放在
viewDidLoad
中分配/保留的所有内容。文档对此进行了详细描述。感谢您提供的信息,Ole。我们案例中的谜团是为什么loadView没有从其XIB重新加载视图,而是给我们留下了一个空白的白色屏幕。但是,如果屏幕是从XIB加载的,您不会覆盖loadView。
UIImageView *imageView = [[[UIImageView alloc] init] autorelease];
[imageView setImage:[UIImage imageNamed:@"image"]];
[self.view addSubview:imageView];