在我开始之前,我会坦率地承认这是我的代码中的某些东西,但是导致它的原因并不是很明显。
我在 NSUserDefaults 中存储了一个布尔值和四个 NSDate 对象。我有一个将信息加载到控件中的视图:布尔值到一个开关中,并且 4 个日期值作为 4 个按钮上的标签作为格式化值加载。如果用户单击按钮,我将切换到带有 UIDatePicker 的新视图,该 UIDatePicker 根据单击的按钮预加载了来自 NSUserDefaults 的完整日期。第二个视图有两个按钮:取消和设置。如果您选择取消,我们将切换回第一个视图。如果您选择将 UIDatePicker 中的值设置为存储在 NSUserDefaults 中,则所选按钮的标签会更新,并且我们切换回第一个视图。
我可以通过单击一个按钮然后连续三次单击取消,然后第四次单击该按钮来始终使应用程序崩溃。从 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 的新手,我确信有更好的方法来做事,我愿意接受建议。