2009-07-11 44 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