ios - 我的程序不断崩溃,我不明白为什么

标签 ios objective-c macos

我对这一切都是陌生的,但我想知道我是否能得到一点帮助。 我正在尝试从 startDate 和 endDate 中获取剩余的天数。我想我在 Apple 文档中的 list #12 中找到了答案---> link

在搜索 stackoverflow 之后,这就是我想出的。

    //My Code (This is code I found on stack overflow and modified
    //Start Date
    //Creating a date from a string then converting it into an NSDate Object
    NSString *startDateString = @"2016-01-01 00:00:00";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"YYYY-MM-dd HH:mm:ss";
    NSDate *startDate = [dateFormatter dateFromString:startDateString];

    //End Date
    NSString *endDateString = @"2016-12-25 00:00:00";
    NSDateFormatter *endDateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"YYYY-MM-dd HH:mm:ss";
    NSDate *endDate = [endDateFormatter dateFromString:endDateString];


    //This is Apple's code.

    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay;

    NSDateComponents *components = [gregorian components:unitFlags
                                                fromDate:startDate
                                                  toDate:endDate options:0];
    NSInteger months = [components month];
    NSInteger days = [components day];


    NSLog(@"there are %ld months and %ld days left till Christmas", months, days);

程序一直崩溃,

 NSDateComponents *components = [gregorian components:unitFlags
                                                fromDate:startDate
                                                  toDate:endDate options:0];

问题,

谁能指导我如何解决这个问题?

最佳答案

简单。您为 endDateFormatter 发送了什么日期格式?

我不是在问你认为你设置了什么日期格式,而是你确实设置了哪种格式。两个不同的问题,完全不同的答案。

现在你问我们是否可以指导你如何解决这个问题:

学习使用调试器。显而易见的事情是逐行执行代码,并检查产生的每个值。然后,您会在 components:fromDate:toDate: 崩溃之前注意到您的 endDate 为零。

最重要的是:学习调试的第一条规则:做错了什么,你需要找出问题所在。这大大减少了可能性。崩溃前只有 11 行代码。其中一个是错误的。其中一个写错了。只需一条一条地检查它们,在您的脑海中坚信其中一行是错误的,这将是显而易见的。

(我就是这样找到bug的。抱着有错的信念看了代码,然后去搜索错误,抱着这种态度很容易找到。初学者深信不疑他们的代码是正确的,因此他们看不到最明显的错误)。

或者逐个变量地检查您的代码。检查 dateFormatter 是如何创建和更改的。检查如何创建和更改 endDateFormatter。你能看到什么不寻常的东西吗?

顺便说一句。 YYYY 与 yyyy 错误在每年年初在经验丰富的开发人员中引起大量笑声,并在经验不足的开发人员中造成巨大的挫败感。每年元旦前后最多三天,该错误会导致许多应用程序显示错误的年份。

顺便说一句。比“如何找到这个问题”更好的问题是“如何避免这个问题”。 Maddy 指出(我认为它有 99% 的可能性是正确的)这是一个复制/粘贴错误。

忽略不需要两个日期格式化程序的事实:在这样的复制/粘贴之后,我使用了编辑器的功能。显然,您需要更改 startDateString、dateFormatter 和 startDate 的使用。编译器甚至会告诉您,因为在粘贴操作之后您立即拥有三个重新声明的变量。

我做什么:双击 startDateString 给出第一个错误。 Command-Shift-E(使其成为搜索字符串)。输入新名称 endDateString,双击它和 Command-C(复制)。 Command-G 查找下一次出现的 startDateString,Command-V(粘贴)用新名称替换它,Command-G 再次出现,直到所有名称的使用都被更改。然后与第二个错误相同。练习使用你的编辑器。

关于ios - 我的程序不断崩溃,我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687643/

相关文章:

objective-c - avaudioplayer问题

ios - 有没有办法让 NSInvocation 支持变量 parmas 函数行 [NSstring stringWithFormat :. .]

macos - 在 Mac OS X 上使用不同的配置文件打开多个 firefox 实例

Java、Mac 操作系统、Windows 和 Linux

ios - iOS 上的 libcurl + cookie

ios - 适用于 iOS 的 Cordova 错误 ITMS-90022 : "Missing required icon file"

ios - XCode 中的单 Storyboard与多 Storyboard,哪个更好

objective-c - 有没有一种方法可以知道工具提示何时出现在 NSImageView 上?

macos - 双击调整点大小时基于单元格的 NSTableView 调用函数?

ios - 在 xcode 中显示 View 属性检查器