2009-07-11 65 views
1

(现在问题解决了,见下面的答案)iPhone SDK:我试图通过增加10的整数和失败

你好,我的应用程序,我想创建一个点计数器。每按一次按钮,数字就会增加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]; 
} 

回答

1

这里有一些事情正在进行。首先,您在增加数据之前先保存数据。这意味着即使保存发生了,它也会低于您的预期。

你看到的实际错误是你正在计数。如果你看,你会发现你有以下线viewDidLoad:

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

尽管事实上,直接引用计数startClick :.我认为你也有一个伊娃尔命名计数,发生了什么是你的意思是设置伊娃,但你实际上是设置局部变量。当班级被分配时,默认情况下,伊娃将被设置为0,这就是为什么它总是被归零的原因。你可以通过修改它来修复它:

count = [prefs integerForKey:@“greeting”];

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

您是否正在编译此代码并显示警告?你想解决这些警告吗?如果你打开了警告,你应该看到类似于“本地声明的'count'隐藏实例变量'

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]; 

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

+0

好吧,谢谢你,现在增加10,但麻烦的是,当应用程序退出并重新开始,它不会将10加到已保存的号码上,而只会继续从10开始计算。 – Amanda 2009-07-11 21:57:06

+0

请看Louis Gerbarg的答案 - 我认为应该回答您的问题。 – 2009-07-11 22:03:59