2012-08-17 54 views
0

我认为这可能只是归结为我没有完全理解当应用程序获得内存警告时应该做的正确事情(或者我不明白iOS发生内存警告时自己做了什么)。如何保存视图控制器由于内存警告而被卸载时的状态?

这里是我的问题的一个简化版本:

我有一个RootViewController。它推动TextViewController,我有一个UITextFieldTextViewController可以推送显示一些细节的DetailViewController

如果我一路推到DetailsViewController,让我的导航视图控制器堆栈[RootVC, TextVC, DetailVC],然后模拟内存警告,TextVC被从内存中自动卸载的iOS。

问题1: iOS只是决定我的视图控制器应该卸载。当用户弹出DetailVC返回到TextVC,我应该在哪里保存状态信息(例如在文本字段中输入的文本)?现在,文本字段只是回到空白,因为视图控制器已卸载然后重新加载。

问题2:当我突然回 TextVC和挖掘文本字段,我的应用程序崩溃。打开僵尸透露,某些 UIView从某处发现了一个 responderDidBecomeActive:消息,当我点击文本字段。 ARC如何实现这个目标?在我的 viewDidUnload方法中,我将文本字段设置为零,甚至将其委托属性设置为零。

编辑。 新问题:我只是通过覆盖 didReceiveMemoryWarningTextVC完全解决了所有问题,并且它没有做任何事情。从1到非常糟糕的规模,这有多糟糕?

EDIT 2 开玩笑,我是个白痴忘了删除一个通知的观察者在一个完全不同但相关的代码。我还是不明白在iOS抛出你的废话时应如何保存状态信息。

回答

2

想想这个的方法如下。当你得到viewDidUnload时,系统已经清除了所有的UI元素。当你回到你的视图时,系统将重新加载笔尖,你会得到viewDidLoad(再次),显然所有的数据和设置将会丢失。

解决方案是在任何可能卸载的viewConroller中,您将保存用户在ivars中输入或设置的任何数据 - 您将在NSString中将文本保存为intstance。在viewDidLoad中,您可以查看该字符串,并且如果其中有数据,则会初始化文本字段。

我告诉你的所有内容都与ios5相关。苹果公司将在未来改变它的做法,但我不能在这里谈论它,因为我在WWDC学到的东西是不披露的。也就是说,通过查看一些WWDC视频或阅读私人开发者列表,您可能会很快找到它。你应该为你将要学习的东西感到高兴!

+0

我还没有看过新的NDA东西,所以我很高兴听到他们正在解决这个问题。我有一个强大的NSString属性,我将其设置为文本字段的值,但是当我触发内存警告并且视图被卸载,然后尝试访问'viewDidLoad'中的属性时,它返回到nil。我错过了什么...? – 2012-08-17 15:51:20

+0

没关系,一切工作都应该如此。现在听起来很愚蠢,但我在iOS开发的几年中并没有想到,* view *在这里被卸载,而不是* view controller *。 – 2012-08-17 16:14:30

+0

我相信笔尖内的所有东西都会被卸载,但现在我正在质疑这一点!对于视图和视图中的任何内容!在几个月内,它的一切都将改变 - 为了更好! – 2012-08-17 18:28:33

相关问题