iphonesdk:我试图将一个整数增加10,但失败了

iphonesdk:我试图将一个整数增加10,但失败了,iphone,xcode,integer,nsuserdefaults,Iphone,Xcode,Integer,Nsuserdefaults,问题现已解决,请参见下面的答案 您好,在我的应用程序中,我正在尝试创建一个积分计数器。每次按下一个按钮,数字就会增加10 我成功地让我的应用程序在每次按下按钮时将值0增加1,并记住最新的值并在下次应用程序启动时显示。但当你在应用程序重新启动后按下该按钮时,点数从0开始增加,而不是记忆中的数值 在退出并再次启动应用程序后,我如何使点数增加10,并记住最新的值,并从中显示和计数 这是我目前的代码: 将值增加1的按钮代码: - (IBAction)startClick:(id)sender{ N

问题现已解决,请参见下面的答案

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

我成功地让我的应用程序在每次按下按钮时将值0增加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];
}
在startClick:方法中,似乎在递增计数整数之前将其存储在用户默认值中。如果要将其增加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];
这也将避免您从用户默认值中以字符串形式检索计数器值。

在startClick:method中,您似乎在递增计数整数之前将其存储在用户默认值中。如果要将其增加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];

这也将避免您从用户默认值中以字符串形式检索计数器值。

这里发生了一些事情。首先,在递增计数之前先保存计数。这意味着,即使储蓄发生了,也会比你预期的低一倍

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

NSInteger count = [prefs integerForKey:@"greeting"];
尽管直接引用startClick中的计数:。我假设你也有一个名为count的ivar,你的意思是设置ivar,但实际上你是在设置局部变量。当类被分配时,ivar默认设置为0,这就是为什么它看起来总是为零。您可以将其更改为:

count=[prefs integerworkey:@greeting]

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


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

这里发生了一些事情。首先,在递增计数之前先保存计数。这意味着,即使储蓄发生了,也会比你预期的低一倍

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

NSInteger count = [prefs integerForKey:@"greeting"];
尽管直接引用startClick中的计数:。我假设你也有一个名为count的ivar,你的意思是设置ivar,但实际上你是在设置局部变量。当类被分配时,ivar默认设置为0,这就是为什么它看起来总是为零。您可以将其更改为:

count=[prefs integerworkey:@greeting]

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


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

好的,谢谢,现在它增加了10,但问题是当退出并再次启动应用程序时,我
t不会在保存的数字上加10,只是继续从10开始计数。看看Louis Gerbarg的答案-我认为这应该回答你的问题。好的,谢谢你,现在它增加了10,但问题是当应用程序退出并重新启动时,它不会在保存的数字上加10,只是从10开始继续计数。看看路易斯·格尔巴格的答案——我想这应该能回答你的问题。非常感谢,它完美地完成了这个任务!哦,不,我没有收到任何警告。而且警告肯定是打开的。非常感谢,它做得非常好!哦,不,我没有收到任何警告。警告肯定是打开的。