web-dev-qa-db-ja.com

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

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

#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 V 4.5 btwの実行


更新:

バックトレース:

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を国際的にも動作するように変更する必要があります。

84
random

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]];

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

MMM dd, yyyy, HH:mm

ローカライズ後のフォーマットは、ローカライズ後のさまざまな方法に見えます。

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

今明らかなのは-.-

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

6
random

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

エラーメッセージのユーモアに関しては、私はそのメッセージを見たことがありませんが、アップルに+1しました。 Cocoa部門の一部のエンジニアは、古き良きエンジニアと同じくらいおかしいですApple昔は.

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

16
Analog File