Đây là loại lỗi châm biếm nào trên iOS?


83

Tôi có một số mã tôi sử dụng để sắp xếp các ngày lịch trông giống như sau:

#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

Nếu tôi chạy nó trong trình mô phỏng thì tất cả đều ổn. Nếu tôi chạy nó trên thiết bị, tôi nhận được thông báo gỡ lỗi mỉa mai này.

2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCcác thành phần: fromDate:]: date không được là 0

Ý tôi là thực sự, bạn nghĩ hoạt động đó có ý nghĩa gì với một ngày không?

Một ngoại lệ đã được tránh cho bây giờ.

Một số lỗi trong số này sẽ được báo cáo với đơn khiếu nại này, sau đó các vi phạm tiếp theo sẽ chỉ âm thầm làm bất cứ điều gì ngẫu nhiên dẫn đến kết quả từ con số không. Đây là hậu quả xảy ra lần này (một số khung có thể bị thiếu do tối ưu hóa trình biên dịch):

Bạn phải bật cười vì điều đó nhưng tôi không chắc chắn rằng dateFormatFromTemplate:mã của tôi có gì sai . Bất kỳ trợ giúp sẽ được đánh giá cao.

Chạy Xcode V 4.5 btw


CẬP NHẬT:

Backtrace:

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

Vì vậy, tôi đoán mọi thứ đang trở nên tồi tệ trong dateAtBeginningOfDayForDatephương pháp của tôi . Trông như thế này:

/*
 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;
}

Tôi sử dụng phương pháp này để chia nhỏ NSDate đã cho thành 'các thành phần cốt lõi của nó để tôi có thể sắp xếp chúng hiệu quả hơn. Tuy nhiên, ứng dụng của tôi phải là quốc tế, đó là lý do đằng sau việc sử dụng NSLocaleđể định dạng đầu ra ngày. Từ những gì có vẻ như tôi sẽ cần phải thay đổi của tôi dateAtBeginningOfDayForDateđể làm việc quốc tế.


40
OK, điều này làm tôi cười. Có người tại Apple có một cảm giác độc ác của sự hài hước ...
nneonneo

3
Nó nói rằng có một trở ngại. Có gì trong nền tảng?
nneonneo 20/09/12

2
Chà, tôi tò mò không biết đường nào trong hai đường đó bị rơi. Giá trị của là formatStringgì?
nneonneo

2
Nó có thực sự sụp đổ ở một trong hai đường đó không? Đó là nơi mà các vết lùi sẽ giúp ...
nneonneo

2
Tôi nghĩ rằng nó khá rõ ràng từ mã bạn đã đăng và lỗi bạn gặp inputDatephải nil. Nhìn vào khung ngăn xếp cao hơn và xem liệu bạn có thể tìm ra những gì có thể gửi nilngày nhập.
nneonneo

Câu trả lời:


16

Lỗi không xảy ra trong mã bạn đã đăng. Nó có nghĩa là một nơi nào đó bạn có một cái gì đó được cho là NSDatevà thay vào đó nó nil.

Về phần hài hước trong thông báo lỗi, tôi chưa bao giờ thấy thông báo đó, nhưng +1 cho Apple. Một số kỹ sư trong bộ phận Cacao cũng hài hước như những kỹ sư cũ giỏi mà Apple đã từng làm trước đây rất nhiều.

Kiểm tra loại chẩn đoán Trình biên dịch MPW C của Apple được sử dụng để đưa ra http://www.netfunny.com/rhf/jokes/91q3/cerrors.html


Nó dài khoảng một dặm, không thực sự nhiều. Vấn đề là nếu tôi chạy mã trên trên thiết bị chỉ có [fmt setDateFormat:@"HH:mm dd MMM yyyy"];nó chạy tốt. Vì vậy, tôi cho rằng điều đó dateFormatFromTemplate:là sai theo một cách nào đó.
ngẫu nhiên

Nhận xét này chỉ liên quan đến khía cạnh hài hước ... Tôi đã từng phải sửa đổi nguồn thành trình điều khiển đĩa SunOS SCSI (sd.c). Có một nhận xét ở trên một số mã kiểm tra bit cho biết / * snarf yummos từ các bit ngon * /
JohnQ

6

Rất cảm ơn nneonneo đã giúp tôi tìm ra điều này.

Vấn đề của tôi là ứng dụng của tôi phải hoạt động trên phạm vi quốc tế nên tôi cần ngày tháng hiển thị theo vị trí của người dùng. Tôi nghĩ rằng tôi sẽ chỉ tạo một NSDateFormatterngôn ngữ cho người dùng sau đó chuyển vào một chuỗi ngày như vậy:

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

Tuy nhiên, vấn đề là tôi đã bản địa hóa định dạng ngày trước khi chuyển sang chuỗi ngày. Trong trường hợp của tôi NSDateFormattertrông như thế này sau khi bản địa hóa.

MMM dd, yyyy, HH:mm

Tôi định dạng sau khi bản địa hóa có thể trông theo nhiều cách khác nhau sau khi bản địa hóa.

Vì vậy, việc chuyển vào một chuỗi có định dạng HH:mm dd MMM yyyylà khiến nó trả về nil.

Đó là điều hiển nhiên bây giờ -.-

Vì vậy, thay vì bản địa hóa khi tôi tạo ngày, tôi tạo ngày với định dạng chuẩn là HH:mm dd MMM yyyy. Sau đó, khi hiển thị, tôi định dạng NSDatengôn ngữ cho người dùng tương ứng.


Bạn cũng cần lưu ý về "tính năng" địa phương .
Hot Licks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.