我现在已经开发了大约3个月的iphone应用程序,并且有一些事情让我感到困惑,我真的不知道如何围绕它们工作。
我有一个导航控制器控制我的应用程序中的视图但是每个加载,使用然后推回的屏幕丢失所有信息,因为它似乎被重新实例化...我相信这是一个可能的内存管理问题?
但是如何创建一个应用程序,在应用程序关闭之前导航并保留其视图中的所有信息。
谢谢:)
答案 0 :(得分:2)
可能您没有保留对视图控制器的引用,问题是UIVIewController
不会被释放。
使视图控制器成为一个ivar,当你将它推到堆栈上时,你只会实例化一次。
// in .h
MyViewController *mVC;
// in .m
// maybe when the user selects a row in a tableview
if(mVC == nil) {
// first time use, alloc/init
mVC = [[MyViewController ....];
}
// then push on the stack
[self.navigationController ....];
当然不要忘记稍后发布。
答案 1 :(得分:1)
在这部分:
MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];
你可能会有这样的东西......相反,让你的myViewController成为一个类的属性,这样你就可以引用它。并删除[myViewController release];
语句。
答案 2 :(得分:0)
您的应用可能正在收到didReceiveMemoryWarning
。
在这种情况下,当调用超类时,框架通过卸载当前未显示的所有视图来执行内存清理。这可以解释你所看到的行为。
要进一步检查,请覆盖其中一个视图控制器中的didReceiveMemoryWarning
或应用代理中的applicationDidReceiveMemoryWarning
,并在其中添加断点。不要忘记恰当地致电[super...]
,否则你的应用很快就会被杀死。您应该以这种方式看到的是视图在到达断点之前不会消失,之后会消失。
如果假设正确,您应该找到一种在viewDidUnload
中保存视图状态并在viewDidLoad
中恢复的方法。另请参阅didReceiveMemoryWarning参考。
答案 3 :(得分:0)
尝试将NSUserDefaults
中的数据保存到较小的地方或使用plist
,或者将其设置得太小,就像5-10个对象一样,保存在appDelegate
的某个变量中,如果它太大使用sqlite
并保存像xml这样的文件图像使用Document directory
答案 4 :(得分:0)
UINavigationController的工作方式类似于堆栈:您可以在其上推送和弹出UIViewControllers。这意味着当UIViewController被弹出时,它的保留计数将减1,如果没有其他对象持有对它的引用,它将被释放。您可以通过在对象上调用-retain(例如在appDelegate中)来自行保留对它们的引用来避免UIViewControllers被释放。
答案 5 :(得分:0)
您可以使用NSUserDefaults在视图中保存UIControl的状态。
因此,无论何时加载视图,都要将值设置为控件,使其看起来像是从我们离开的位置继续。