Bu iOS ne tür alaycı bir hata?


83

Aşağıdaki gibi görünen takvim tarihlerini sıralamak için kullandığım bazı kodum var:

#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

Simülatörde çalıştırırsam her şey yolunda. Cihazda çalıştırırsam bu alaycı hata ayıklama mesajını alırım.

2012-09-19 22: 40: 13.972 APPNAME [4923: 907] * - [__ NSCFCalendar bileşenleri: fromDate:]: tarih sıfır olamaz

Gerçekten, sıfır randevuyla bu operasyonun ne anlama geldiğini düşünüyorsun?

Şimdilik bir istisnadan kaçınıldı.

Bu hatalardan birkaçı bu şikayetle birlikte rapor edilecek, daha sonra başka ihlaller, sıfırdan kaynaklanan rastgele şey ne olursa olsun sessizce yapılacaktır. İşte bunun bu sefer meydana geldiği geri izleme (derleyici optimizasyonları nedeniyle bazı çerçeveler eksik olabilir):

Gülmek zorundasın ama kodumda neyin yanlış olduğundan emin değilim dateFormatFromTemplate:. Herhangi bir yardım memnuniyetle karşılanacaktır.

Xcode V 4.5 btw'yi çalıştırma


GÜNCELLEME:

Geri izleme:

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

Sanırım dateAtBeginningOfDayForDateyöntemimde işler kötü gidiyor . Şuna benzeyen:

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

Bu yöntemi, belirli bir NSDate'i temel bileşenlerine ayırmak için kullanıyorum, böylece hepsini daha verimli bir şekilde sıralayabilirim. Ancak, uygulamamın uluslararası olması gerekiyor, bu NSLocaleda tarih çıktısını biçimlendirmek için kullanmanın arkasındaki sebep . Görünüşe göre, dateAtBeginningOfDayForDateuluslararası işime de ihtiyacım olacak .


40
Tamam, bu beni güldürdü. Apple'da birinin acımasız bir mizah anlayışı var ...
nneonneo

3
Geri izleme olduğunu söylüyor. Geri izlemede ne var?
nneonneo

2
Bu iki hattan hangisinin düştüğünü merak ediyordum. Değeri nedir formatString?
nneonneo

2
Bu iki hattan birinde gerçekten çöküyor mu? Geri
izlemenin

2
Ben anladınız deftere kodu ve hatadan çok açık olduğunu düşünüyorum inputDateolmalıdır nil. Daha yüksek yığın çerçevelerine bakın ve nilgiriş tarihini neyin gönderebileceğini bulup bulamayacağınızı görün.
nneonneo

Yanıtlar:


16

Hata, gönderdiğiniz kodda olmuyor. Bir yerde olması gereken bir şeye sahip olduğunuz anlamına gelir NSDateve onun yerine budur nil.

Hata mesajındaki mizah konusuna gelince, bu mesajı hiç görmedim, ancak Apple'a +1. Kakao bölümündeki bazı mühendisler, Apple'ın çok zaman önce sahip olduğu eski iyi mühendisler kadar komik.

Http://www.netfunny.com/rhf/jokes/91q3/cerrors.html için Apple'ın MPW C derleyicisinin kullandığı tanılama türüne bakın


Yaklaşık bir mil uzunluğunda, pek fazla değil. Mesele şu ki, yukarıdaki kodu sadece cihazda [fmt setDateFormat:@"HH:mm dd MMM yyyy"];çalıştırırsam iyi çalışıyor. Bu yüzden bunun bir dateFormatFromTemplate:şekilde yanlış olduğunu varsayıyorum .
rastgele

Bu yorum sadece mizah açısından ilgilidir ... Bir keresinde kaynağı SunOS SCSI disk sürücüsüne (sd.c) değiştirmek zorunda kaldım. Bazı bit test kodunun üzerinde / * lezzetli bitlerden
yummos koparıp

6

Bunu çözmeme yardım ettiği için nneonneo'ya çok teşekkürler .

Benim sorunum, uygulamamın uluslararası olarak çalışması gerektiğinden kullanıcı konumuna göre görüntülemek için tarihlere ihtiyacım vardı. Sadece NSDateFormatterkullanıcıların yerel ayarını oluşturacağımı ve ardından şöyle bir dize tarihi geçireceğimi düşündüm :

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

Ancak sorun şu ki , dize tarihini geçmeden önce tarih biçimini yerelleştiriyordum . Benim durumumda NSDateFormatteryerelleştirmeden sonra böyle görünüyordu.

MMM dd, yyyy, HH:mm

Yerelleştirmeden sonraki format, yerelleştirmeden sonra birçok farklı şekilde görünebilir.

Yani bir formatta bir dizge geçmek HH:mm dd MMM yyyyonun dönmesine neden oluyordu nil.

Şimdi apaçık olan -.-

Bu yüzden tarihi oluştururken yerelleştirmek yerine standart formatta bir tarih oluşturuyorum HH:mm dd MMM yyyy. Sonra görüntülerken, NSDatekullanıcının ilgili yerel ayara göre biçimlendiriyorum .


Ayrıca yerel ayar "özelliğinin" farkında olmanız gerekir .
Hot Licks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.