始める前に、それが私のコードの何かであることを自由に認めますが、何が原因であるかは明白ではありません。
1 つのブール値と 4 つの NSDate オブジェクトを NSUserDefaults に格納しています。情報をコントロールにロードするビューがあります。ブール値をスイッチにロードすると、4 つの日付値が 4 つのボタンのラベルとして書式設定された値としてロードされます。ユーザーがボタンをクリックすると、クリックされたボタンに基づいて NSUserDefaults から完全な日付がプリロードされた UIDatePicker を持つ新しいビューに切り替わります。2 番目のビューには、キャンセルと設定の 2 つのボタンがあります。キャンセルを選択すると、最初のビューに戻ります。UIDatePicker から値を設定することを選択すると、NSUserDefaults に保存され、選択したボタンのラベルが更新され、最初のビューに戻ります。
ボタンをクリックしてから 3 回続けて [キャンセル] をクリックし、4 回目のボタンをクリックすると、アプリケーションを一貫してクラッシュさせることができます。NSUserDefaults から値を取得すると、objc_msgSend でクラッシュします。
関係する 3 つの関数を次に示します。
- (IBAction) buttonPressed:(id)sender {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDate *buttonDate;
switch ([sender tag]) {
case 1000:
pressedString = kStartTime1Key;
pressedButton = start1;
break;
case 1001:
pressedString = kEndTime1Key;
pressedButton = end1;
break;
case 1002:
pressedString = kStartTime2Key;
pressedButton = start2;
break;
case 1003:
pressedString = kEndTime2Key;
pressedButton = end2;
break;
default:
break;
}
buttonDate = [defaults objectForKey:pressedString];
if (buttonDate == nil) buttonDate = [NSDate date];
[datePicker setDate:buttonDate animated:NO];
[buttonDate release];
self.view = datePickerView;
}
- (IBAction) savePressed {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDate *selected = [datePicker date];
[defaults setObject:selected forKey:pressedString];
[pressedButton setTitle:[self parseDate:selected] forState:UIControlStateNormal];
self.view = settingsView;
}
- (IBAction) cancelPressed {
self.view = settingsView;
}
iPhone と Obj-C の初心者なので、もっと良い方法があると確信しています。提案をお待ちしています。