我遇到了一个相对简单的问题,该问题一直在逃避解决方案一段时间。我有一个视图控制器和一个关联的XIB。视图控制器称为FooterViewControllerFooterViewController的视图设置为tableview的页脚视图。
FooterViewController的视图包括用于向用户显示反馈的标签。我希望此标签能够一直保留到应用程序更改其值为止。在正常情况下,它会这样做。但是,我刚刚开始使用内存警告进行测试,并且发现响应于内存警告而卸载视图后,标签将被清除。

到目前为止,我已经尝试解决此问题:在FooterViewControllerviewWillUnload方法中,我将标签的文本存储在名为statusString的实例变量中:

- (void)viewWillUnload
{
    statusString = [statusLabel text];
    testInt = 5;
    NSLog(@"View will unload; status string = %@; testInt = %d",
            statusString, testInt);

    [super viewWillUnload];
}

请注意,我还将另一个声明为NSInteger testInt的实例变量设置为5。

然后,在FooterViewControllerviewDidLoad方法中,我尝试将标签的文本设置为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/

    10-12 16:17