이 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 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국제적으로도 일 하기 위해 저 를 변경해야 할 것 같습니다 .


40
좋아, 이것은 나를 웃게 만들었다. 애플에서 누군가가 ... 유머 잔인한 감각이
nneonneo

3
역 추적이 있다고합니다. 역 추적에 무엇이 있습니까?
nneonneo

2
글쎄, 나는 그 두 줄 중 어느 것이 충돌했는지 궁금했습니다. 의 가치는 formatString무엇입니까?
nneonneo

2
이 두 줄 중 하나에서 실제로 충돌합니까? 역 추적이 도움이의 그 ...
nneonneo

2
나는 당신이있어 사용자가 게시 된 코드와 오류에서 매우 명백 생각 inputDate해야합니다 nil. 상위 스택 프레임을보고 nil입력 날짜를 보낼 수있는 항목을 파악할 수 있는지 확인 합니다.
nneonneo

답변:


16

게시 한 코드에서는 오류가 발생하지 않습니다. 그것은 당신이 있어야 할 무언가가있는 곳을 의미 NSDate하고 대신 nil.

오류 메시지의 유머는 해당 메시지를 본 적이 없지만 Apple에 +1합니다. Cocoa 부서의 일부 엔지니어는 Apple이 오래 전에 사용했던 좋은 오래된 엔지니어만큼 재미 있습니다.

http://www.netfunny.com/rhf/jokes/91q3/cerrors.html 을 뱉어내는 데 사용 된 Apple의 MPW C 컴파일러 진단의 종류를 확인하십시오 .


길이는 약 1 마일이지만 실제로는 그리 많지 않습니다. 문제는 위의 코드를 장치에서만 실행하면 제대로 실행된다는 것입니다 [fmt setDateFormat:@"HH:mm dd MMM yyyy"];. 그래서 나는 그것이 dateFormatFromTemplate:어떤면에서 잘못 되었다고 가정하고 있습니다.
무작위로

이 코멘트는 유머와 관련이 있습니다. 저는 한때 소스를 SunOS SCSI 디스크 드라이버 (sd.c)로 수정해야했습니다. 일부 비트 테스트 코드 위에 댓글이 있습니다. / * 맛있는 비트에서 yummos snarf yummos * /
JohnQ

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

그러나 문제는 문자열 날짜를 전달 하기 전에 날짜 형식을 현지화했다는 것 입니다. 제 경우에는 NSDateFormatter현지화 후 이렇게 보였습니다.

MMM dd, yyyy, HH:mm

현지화 후 형식은 현지화 후 다양한 방식으로 보일 수 있습니다.

의 형식의 문자열을 전달 그래서 HH:mm dd MMM yyyy그것을 반환하는 원인이되었다 nil.

지금 당연한 -.-

따라서 날짜를 만들 때 현지화하는 대신 표준 형식으로 날짜를 만듭니다 HH:mm dd MMM yyyy. 그런 다음 표시 할 때 NSDate사용자에게 로케일을 포맷합니다 .


또한 로케일 "기능"을 알고 있어야합니다 .
핫릭
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.