1

在我开始之前,我会坦率地承认这是我的代码中的某些东西,但是导致它的原因并不是很明显。

我在 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 的新手,我确信有更好的方法来做事,我愿意接受建议。

4

1 回答 1

0

[按钮日期发布];

你不能释放你没有分配或保留的东西。

于 2009-08-26T03:44:02.213 回答