1

(问题现已解决,请参阅下面的答案)

您好,在我的应用程序中,我正在尝试创建一个积分计数器。每按一次按钮,数字就会增加 10。

每次按下按钮时,我成功地让我的应用程序将值 (0) 增加 1,并记住最新值并在下次应用程序启动时显示它。但是,当您按下假设在应用程序重新启动后将点值增加 1 的按钮时,数字从 0 开始增加,而不是记住的值。

在应用程序退出并重新启动后,我如何让积分增加 10 并记住最新的值和显示(并从中计数)?

这是我当前的代码:

按钮将值增加 1 的代码:

   - (IBAction)startClick:(id)sender{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:count forKey:@"greeting"];

NSString *numValue = [[NSString alloc] initWithFormat:@"%d", count++];
counter.text = numValue;

viewDidLoad 方法:

   - (void)viewDidLoad {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *greetName = [prefs stringForKey:@"greeting"];
NSInteger count = [prefs integerForKey:@"greeting"];
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];

if(count == 0) {
    counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
} else {
    counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
}
4

2 回答 2

3

在您的startClick:方法中,您似乎count在递增之前将整数存储在用户默认值中。如果要将其增加 10,则将方法更改为:

- (IBAction)startClick:(id)sender {
    //Increase count by 10
    count+=10;

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setInteger:count forKey:@"greeting"];

    NSString *numValue = [[NSString alloc] initWithFormat:@"%d", count];
    counter.text = numValue;
}

另外,为什么要设置counter.text属性两次?:

counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];

if(count == 0) {
        counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
} else {
        counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
}

stringWithFormat使用而不是分配NSString和调用它也可能对您有用initWithFormat,因为目前它正在泄漏内存,因为您没有释放它;如果您调用stringWithFormat,它将返回一个自动释放的对象,该对象将在counter.text设置时保留(因为它是 setter 方法的简写),因此您不会有内存问题。您可以将行更改为:

counter.text = [NSString stringWithFormat:@"%d",count];

这也将使您免于从用户默认值中检索计数器值作为字符串。

于 2009-07-11T21:47:14.543 回答
1

这里发生了几件事。首先,您在增加计数之前保存计数。这意味着即使保存发生,它也会比您预期的低一个。

您看到的实际错误是您正在忽略计数。如果您看一下,您会注意到在 viewDidLoad 中有以下行:

NSInteger count = [prefs integerForKey:@"greeting"];

尽管在 startClick: 中直接引用计数。我假设您还有一个名为 count 的 ivar,并且您的意思是设置 ivar,但实际上您是在设置局部变量。分配类时,ivar 默认设置为 0,这就是为什么它似乎总是归零的原因。您可以通过将其更改为:

count = [prefs integerForKey:@"greeting"];

如果您在应用程序退出期间崩溃,您的值也可能不会同步到磁盘,但除非您在运行日志中看到不应该成为问题的崩溃。如果它很重要,您可以显式同步出该值。

您是否在打开警告的情况下编译此代码?您是否正在尝试修复这些警告?如果您打开了警告,您应该会看到类似“'count' 的本地声明隐藏实例变量”之类的内容

于 2009-07-11T22:02:02.017 回答