iPhone应用程序 - 内存警告后背景消失

时间:2010-09-12 14:18:43

标签: iphone objective-c memory-leaks

当我在基于导航的iPhone App中收到内存警告时,背景图像会在先前分配的导航控制器中消失。

背景图像被设置为UIView的背景属性。然后将此视图添加到App委托的主窗口中:

UIView *backgroundView = [[UIView alloc] initWithFrame: window.frame];

backgroundView.backgroundColor = [UIColor colorWithPatternImage:[[Utilities sharedManager] getImageWithName:@“Hintergrund2”]];  backgroundView.tag = 56789;  [window addSubview:backgroundView];  [backgroundView release];

[window addSubview:[navigationController view]];

[window makeKeyAndVisible];

收到内存警告消息并按下导航控制器的后退按钮后,上一个导航控制器显示正常的Apple灰色背景。我必须导航回我的主屏幕并向前导航以“重置”背景图像。

谁能告诉我为什么背景会消失?这不是因为图像,当我将背景设置为标准的UIColor(如blackColor)时,背景(颜色)也会消失。

提前感谢您的帮助!

问候

菲尔

3 个答案:

答案 0 :(得分:2)

在内存不足的情况下,未定义操作系统直接添加到主UIWindow的内容。

也许考虑使用简单的UIViewController作为背景?当内存不足时,你至少会得到回调。

答案 1 :(得分:0)

首先,您应该将控制器添加到窗口中,如下所示:

window.rootViewController = navigationController;

我没有测试过这个,但也许你可以直接设置窗口的背景颜色:

window.backgroundColor = [UIColor colorWithPatternImage:[[Utilities sharedManager] getImageWithName:@"Hintergrund2"]];

如果这不起作用,您将需要一种更好的方法来在低内存情况下重新创建视图状态。最常用的方法是在每个xib中定义背景,然后重新加载。或者,您可以通过查看backgroundView是否具有超级视图来捕获低内存警告并根据需要重新创建。

答案 2 :(得分:0)

确保您在视图控制器的self.view.backgroundColor = [UIColor clearColor];中设置了调用- (void) viewDidLoad,否则将无法显示窗口的图像。

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor clearColor];
...
}

我的问题是我在初始化时设置了视图backgroundColor

MyTableViewController  *myTVC =
    [[MyTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
myTVC.view.backgroundColor = [UIColor clearColor];

而不是- (void) viewDidLoad

在这种情况下,UITableViewController视图的背景颜色是在最初创建后设置的。但是,在内存不足警告之后,未显示的UIViewController会调用- (void) viewDidUnload。这剥夺了他们的观点。就在再次显示UIViewController之前,- (void) viewDidLoad被调用并创建了一个新视图,但视图的背景颜色设置为默认值,不明确。