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:格納しているように見えます。count10 ずつ増やしたい場合は、メソッドを次のように変更します。

- (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プロパティを 2 回設定するのですか?:

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が設定されたときに保持されます (セッター メソッドの短縮形であるため)。したがって、メモリの問題は発生しません。行を次のように変更できます。

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

これにより、カウンター値をユーザーのデフォルトから文字列として取得する手間も省けます。

于 2009-07-11T21:47:14.543 に答える
1

ここでいくつかのことが起こっています。まず、インクリメントする前にカウントを保存しています。つまり、保存が行われたとしても、予想よりも 1 つ低くなるということです。

あなたが見ている実際のバグは、カウントを省略しているということです。見てみると、viewDidLoad に次の行があることがわかります。

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

startClick: で count を直接参照しているにもかかわらず。count という名前の ivar も持っていると思います。何が起こっているのかというと、ivar を設定するつもりですが、実際にはローカル変数を設定しています。クラスが割り当てられると、ivar はデフォルトで 0 に設定されます。これが、常にゼロに見える理由です。次のように変更することで修正できます。

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

アプリケーションの終了中にクラッシュした場合、値がディスクに同期されていない可能性もありますが、実行ログにクラッシュが見られない限り、問題にはなりません。重要な場合は、値を明示的に同期できます。

警告をオンにしてこのコードをコンパイルしていますか? これらの警告を修正しようとしていますか? 警告がオンになっている場合は、「'count' のローカル宣言がインスタンス変数を非表示にする」のようなメッセージが表示されるはずです。

于 2009-07-11T22:02:02.017 に答える