我遇到了一个相对简单的问题,该问题一直在逃避解决方案一段时间。我有一个视图控制器和一个关联的XIB。视图控制器称为FooterViewController
。 FooterViewController
的视图设置为tableview的页脚视图。FooterViewController
的视图包括用于向用户显示反馈的标签。我希望此标签能够一直保留到应用程序更改其值为止。在正常情况下,它会这样做。但是,我刚刚开始使用内存警告进行测试,并且发现响应于内存警告而卸载视图后,标签将被清除。
到目前为止,我已经尝试解决此问题:在FooterViewController
的viewWillUnload
方法中,我将标签的文本存储在名为statusString
的实例变量中:
- (void)viewWillUnload
{
statusString = [statusLabel text];
testInt = 5;
NSLog(@"View will unload; status string = %@; testInt = %d",
statusString, testInt);
[super viewWillUnload];
}
请注意,我还将另一个声明为
NSInteger testInt
的实例变量设置为5。然后,在
FooterViewController
的viewDidLoad
方法中,我尝试将标签的文本设置为statusString
:- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Just before setting label, statusString: %@; testInt: %d",
statusString, testInt);
[statusLabel setText:statusString];
NSLog(@"View did load.");
}
但是,这不起作用。此外,在模拟内存警告后的日志中,我看到:
View will unload; status string = Invalid IP address Error code: 113; testInt = 5
(请注意,“无效的IP地址错误代码:113”是statusString的正确值)
然后,再次导航到
FooterViewController
后,我看到:Just before setting label, statusString: (null); testInt: 0
这向我表明,由于某种原因,当再次加载视图时,
FooterViewController
的实例变量将被重新初始化。最后一点:每次必须重新加载视图时都会调用initWithNibName:bundle:
方法,尽管我希望这样做。毕竟,必须从NIB重新加载视图。所以,我的问题是:
谢谢,
赖利
最佳答案
statusString看起来像一个弱引用,而不是强属性。它不能保留标签的文本,当视图卸载时,标签的文本将与标签解除分配。这就是为什么您首先获得正确值的原因(在释放标签之前),然后再返回null(在释放标签之后,弱引用无效)。将您的statusString变成一个强大的属性,并且ARC的魔力将不再咬您。
关于objective-c - 防止在内存警告时清除实例变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11088167/