このiOSはどのような皮肉なエラーですか?


83

次のようなカレンダーの日付を並べ替えるために使用するコードがいくつかあります。

#if !(TARGET_IPHONE_SIMULATOR)
    NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
                                                              locale:[NSLocale currentLocale]];
    [fmt setDateFormat:formatString];
#else
    [fmt setDateFormat:@"HH:mm dd MMM yyyy"];
#endif

シミュレーターで実行すれば、すべて問題ありません。デバイスで実行すると、この皮肉なデバッグメッセージが表示されます。

2012-09-19 22:40:13.972 APPNAME [4923:907] * -[__ NSCFCalendar components:fromDate:]:日付をnilにすることはできません

本当に、操作がゼロの日付で何を意味することになっていると思いますか?

今のところ、例外は回避されています。

これらのエラーのいくつかはこの苦情で報告される予定であり、その後の違反は、nilから生じるランダムなことを何でも黙って実行します。今回これが発生したバックトレースは次のとおりです(コンパイラの最適化のために一部のフレームが欠落している可能性があります)。

あなたはそれを笑わなければなりませんが、私のdateFormatFromTemplate:コードの何が悪いのかわかりません。どんな助けでもいただければ幸いです。

Xcode V4.5の実行


更新:

バックトレース:

0 CoreFoundation 0x39ff0e55 + 84
1 APPNAME 0x00040be1- [MeetingsViewController dateAtBeginningOfDayForDate:] + 140

ですから、私のdateAtBeginningOfDayForDate方法では事態が悪化していると思います。これは次のようになります:

/*
 Break down a given NSDate to its bare components for sorting
 */
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
    // Use the user's current calendar and time zone
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    [calendar setTimeZone:timeZone];

    // Selectively convert the date components (year, month, day) of the input date
    NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate];

    // Set the time components manually
    [dateComps setHour:0];
    [dateComps setMinute:0];
    [dateComps setSecond:0];

    // Convert back
    NSDate *beginningOfDay = [calendar dateFromComponents:dateComps];
    return beginningOfDay;
}

このメソッドを使用して、特定のNSDateをそのコアコンポーネントに分解し、それらすべてをより効率的にソートできるようにします。ただし、私のアプリは国際的である必要がありNSLocaleます。これが、日付出力のフォーマットに使用する理由です。どうやら私はdateAtBeginningOfDayForDate国際的にも働くように自分を変える必要があるようです。


40
OK、これは私を笑わせました。アップルで誰かが...ユーモアの残酷な感覚を持っている
nneonneo

3
バックトレースがあると書かれています。バックトレースには何がありますか?
nneonneo 2012

2
さて、私はそれらの2つのラインのどちらがクラッシュしたかについて興味がありました。の価値はformatString何ですか?
nneonneo 2012

2
これらの2行のいずれかで本当にクラッシュしますか?バックトレースが役立つだろうということ...
nneonneo

2
あなたが投稿したコードとあなたが得たエラーからそれはかなり明白だと思いinputDateますnil。上位のスタックフレームを見て、nil入力日を送信する可能性のあるものを把握できるかどうかを確認します。
nneonneo 2012

回答:


16

投稿したコードではエラーは発生しません。それはあなたがどこかにあるはずの何かを持っていることを意味しNSDate、代わりにそれはnilです。

エラーメッセージのユーモアについては、私はそのメッセージを見たことがありませんが、Appleに+1します。ココア部門のエンジニアの中には、アップルが昔から持っていた古き良きエンジニアと同じくらい面白い人もいます。

http://www.netfunny.com/rhf/jokes/91q3/cerrors.htmlを吐き出すために使用されたAppleのMPWCコンパイラの種類の診断を確認してください。


それは約1マイルの長さですが、実際にはそれほど多くはありません。問題は、上記のコードをデバイスで実行した場合、[fmt setDateFormat:@"HH:mm dd MMM yyyy"];それだけで正常に実行されるということです。だから私はそれdateFormatFromTemplate:が何らかの形で間違っていると思います。
ランダムな

このコメントはユーモアの観点からのみ関連しています...私はかつてソースをSunOSSCSIディスクドライバー(sd.c)に変更する必要がありました。いくつかのビットテストコードの上に、/ *おいしいビットからyummosをsnarfyするというコメントがありました* /
JohnQ 2013年

6

私がこれを理解するのを手伝ってくれたnneonneoに感謝します。

私の問題は、アプリが国際的に機能する必要があるため、ユーザーの場所に関して表示する日付が必要だったことです。NSDateFormatterユーザーロケールにを作成してから、次のように文字列の日付を渡すだけだと思いました。

 NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
                                                              locale:[NSLocale currentLocale]];
date = [fmt dateFromString:[NSString stringWithFormat:@"%@ %@", obj.meetingTime, obj.meetingDate]];

ただし、問題は、文字列dateを渡すに日付形式をローカライズしていたことです。私の場合NSDateFormatter、ローカライズした後は次のようになりました。

MMM dd, yyyy, HH:mm

ローカライズ後のフォーマットは、ローカライズ後にさまざまな方法で表示される可能性があります。

したがって、の形式の文字列を渡すと、HH:mm dd MMM yyyyが返されていましたnil

これは今明らかです -.-

したがって、日付を作成するときにローカライズする代わりに、の標準形式で日付を作成しますHH:mm dd MMM yyyy。次に、表示するときNSDateに、ユーザーのそれぞれのロケールに合わせてフォーマットします。


また、ロケールの「機能」にも注意する必要があります
ホットリック2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.