我的程序一直在崩溃,我无法弄清楚原因

时间:2016-01-08 23:14:36

标签: ios objective-c macos

我是这一切的新手,但我想知道我是否能得到一些帮助。 我试图从startDate和endDate中获取剩余的时间。我以为我在Apple文档中的#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];

问题,

有人可以指导我如何解决此问题吗?

1 个答案:

答案 0 :(得分:4)

Simples。你为endDateFormatter发送了什么dateFormat?

我不是在问你设置的想法的dateFormat,而是做了设置的格式。两个不同的问题,答案完全不同。

现在您问我们是否可以指导您如何解决此问题:

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

最重要的是:了解调试的第一条规则:做错了什么,你需要找出它是什么。这大大减少了可能性。崩溃前只有11行代码。其中一个是错的。其中一个写错了。只是逐个浏览它们,在你的脑海中坚定地认为其中一条线是错误的,这很明显。

(那就是我如何找到这个错误。看着代码时坚信有错误,并搜索错误,并以这种态度对其进行了搜索。很容易找到。初学者确信他们的代码是正确的,因此他们无法看到最明显的错误)。

或者按变量检查你的代码变量。检查如何创建和更改dateFormatter。检查endDateFormatter的创建和更改方式。你能看到什么不寻常的东西?

顺便说一句。 YYYY vs yyyy bug在经验丰富的开发人员中产生了很多笑声,并在每年年初经验不足的人中产生了巨大的挫败感。每年新年前后最多三天,该错误导致许多应用程序显示错误。

顺便说一句。一个更好的问题而不是"如何找到这个问题"将是"如何避免问题"。 Maddy评论说(并且我说99%的可能性是正确的)这是一个复制/粘贴错误。

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

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