【问题标题】:Managing memory across multiple views跨多个视图管理内存
【发布时间】:2012-02-07 18:44:34
【问题描述】:

我正在构建一个应用程序,它的主视图由地图视图组成。第二个视图有一些必要的配置选项(配置视图)。我使用部分 curl segue 转到此配置视图。

我遇到的问题是我的配置视图的状态没有得到维护。

例如,

我将进入配置视图,对设置进行一些更改并返回主地图视图。一旦我再次返回配置视图,这些值就会恢复到它们的默认值。有问题的值是 distanceFilterValue

这是我的配置视图控制器的实现:

@interface SimpleConfigViewController()
//private interface inside implementation
@property (weak, nonatomic) UISlider * distanceFilterSlider;
@property (strong, nonatomic) NSNumber *distanceFilterValue;
@end

@implementation SimpleConfigViewController

@synthesize distanceFilterLabel = _distanceFilterLabel;
@synthesize distanceFilterSlider = _distanceFilterSlider;
@synthesize distanceFilterValue = _distanceFilterValue;

- (NSNumber *)distanceFilterValue {
    if (!_distanceFilterValue) {
        _distanceFilterValue = [NSNumber numberWithFloat:250.0];
    }
    return _distanceFilterValue;
}

- (IBAction)distanceSliderValueChanged:(UISlider *)sender {
    self.distanceFilterValue = [NSNumber numberWithFloat:sender.value];
    //update GUI
    self.distanceFilterLabel.text = [NSString stringWithFormat:@"%.f m", sender.value];
}


@end

在我看来,因为我保留了一个指向 distanceFilterValue 的强指针,所以当我返回配置视图时,这个值应该是正确的。我显然在这里遗漏了一些东西。

提前感谢您的帮助。

【问题讨论】:

  • 相关的是地图视图的实现。
  • 在我真正开始将配置值连接到地图视图之前,我正在尝试让配置视图独立于地图视图工作。

标签: iphone objective-c ios xcode4 ios5


【解决方案1】:

我可能是错的,但我猜配置视图已卸载,并在第二次推送时从 XIB 再次加载。

无论如何,您都应该将值存储在模型对象中,而不是控制器中!

【讨论】:

  • 我已经放置了记录消息来测试这一点,我发现在第一次加载配置视图时会调用 viewDidLoad。但是在返回地图视图时,不会调用 viedDidUnload
  • 我意识到我应该将 distanceFilterValue 放在模型对象中,但保持指向 NSNumber 对象的强指针不能达到相同的效果吗?我的模型很简单,就是一个包装类,我会为其保留一个强指针。 (这是我的思考过程,我的假设很可能是错误的)
【解决方案2】:

我认为 Erik 是对的,每次您为 configView 调用 viewDidLoad 时,它都会重置。你可以使用 Singleton 或 NSUserDefaults 来解决这个问题。

【讨论】:

  • 我想我不明白的是在什么时候(以及为什么)我指向 distanceFilterValue 的强指针发布
  • configView 中的 viewDidLoad 中有什么内容?
  • 只是标准的 [super viewDidLoad];
猜你喜欢
  • 2015-10-09
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多