2

我有一个iPad应用程序,它有一个主视图控制器,然后是一个设置视图控制器。当我的主视图呈现设置视图时,我将全屏显示设置视图。在设置视图中有一个解除按钮,它可以工作 - 直到发生内存警告。如果在屏幕上显示设置按钮时发生内存警告,它将拒绝解除。内存警告是否破坏了呈现视图控制器?

换句话说,这个工程:

  • 应用程序启动 - >显示主视图 - >显示设置查看 - >关闭设置查看

这不:

  • 应用程序启动 - >显示主视图 - >显示设置视图 - >内存警告 - >关闭设置视图

设置视图将停留在那里。

我在第一代iPad上的iOS 5上运行此应用程序。 (我不支持iOS 4.)

我该如何解决这个问题?

编辑:

这里是我的代码显示设置视图:

- (void) showSettings{ 

    if (!self.settingsViewController) { 

    //Create the navigation controller and the root view for the settings panel 
    SettingsViewController *settingsRootView = [[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UINavigationController *settingsView = [[UINavigationController alloc] initWithRootViewController:settingsRootView]; 
    [settingsRootView release]; 

    //Configure the animation and modal style, and the navigation bar's color 

    [settingsView.navigationBar setTintColor:kDarkGrayColor]; 

    //Enable the settings flag 
    [self setSettingsIsActive:YES]; 

    //Configure the presentation 
    [settingsView setModalPresentationStyle:UIModalPresentationFullScreen]; 
    [settingsView setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

    self.settingsViewController = settingsView; 

    [settingsView release]; 
    } 

    //present and release the settings panel 
    [self presentViewController:self.settingsViewController animated:YES completion:^{ 

    }]; 

} 

这里就是我如何隐藏:

//This method reloads some stuff and 
- (void) dismissSettings{ 

    // 
    // ... Reload some other stuff... 
    // 

    //Dismiss the settings panel 
    [self dismissViewControllerAnimated:YES completion:^{ 

    // 
    // ... Reload some other stuff... 
    // 

    }]; 
} 
+0

你发现了什么给你记忆警告?你是否在做任何didReceiveMemoryWarning中做任何事情? – Rob 2012-01-27 13:50:00

+0

@Rob - 不要和不要。 – Moshe 2012-01-27 16:21:40

回答

4

原则上,内存警告对您的视图控制器不起任何作用,但它会卸载那些当前未显示在屏幕上的视图控制器的视图。

在您的具体情况下,我会从您的设置视图控制器的代码中查找任何可能引用主视图控制器视图中的内容的代码。如果是这种情况,那么在发生内存警告后,很可能引用将为零。

此外,您应该验证您的didReceiveMemoryWarning方法的实现,以查看您是否正在处理可能需要关闭该设置视图的某些内容。

在内存不足的情况下,所有来自这些“非活动”视图控制器的视图都将被卸载。由于在主控制器上声明了dismissSettings方法,所以在调用它时很有可能主视图中的所有元素均为零。我不知道“Reload some other stuff”代码中包含了哪些操作,但我认为与该视图相关的一些事情正在使该方法失败。

我建议将所有与视图相关的重载代码移动到viewDidAppear方法,因为它将保证视图已加载。另一方面,我会建议你在实际的设置视图控制器上移动工具的解雇方法(记住它应该像[ self.navigationController dismissModalViewControllerAnimated:YES];那样,因为你需要关闭导航控制器)。至少,这是我一直这样做的方式,从来没有让我失望。逻辑是我不希望不活动的视图控制器运行任何逻辑。

最后,正如你所提到的你的目标是iOS 5及以上版本,我会极力推荐你的项目移到ARC。做起来比看起来容易,一旦你感动了,它确实很棒。

您的问题的另一个可能的原因是,您正在使用通知调用您的解雇方法,并且您的主控制器正在取消订阅viewDidUnload方法上的通知。请记住,当低内存条件触发时,将调用viewDidUnload方法!

+0

除了对超级实现 – Moshe 2012-01-27 14:24:03

+0

的调用,viewDidReceiveMemoryWarning方法中什么也没有,并且Settings View Controller是否有任何对Main View Controller的引用?另外,因为大部分情况下,主视图控制器的视图都将被释放,您应该从主视图控制器验证viewDidUnload方法内部的内容。 – flainez 2012-01-27 14:49:52

+0

不,不参考主视图控制器。层次结构为:主窗口 - >主视图控制器 - >设置视图控制器 – Moshe 2012-01-27 16:21:23

0

第一件事就是找出是什么引起记忆警告。使用仪器并检查是否有泄漏。如果你使用的是ARC,这应该是一个问题 - 但显然有一些内存警告发生严重错误。解决这个问题,你已经解决了你的问题。

也就是说,当内存开始变短时,操作系统将关闭应用程序。后台应用程序通常是第一个去的,但是很多时候,如果泄漏足够糟糕,从后台应用程序终止到运行应用程序终止的时间段可能很短。

相关问题