Ошибка для [NSString stringWithFormat:]

Я отправил свою заявку в Apple на рассмотрение, но Apple отклонила и предоставила мне следующий отчет о сбое.

Thread 0 Crashed:
1   Foundation                      0x3595dd04 _NSDescriptionWithLocaleFunc + 44
2   CoreFoundation                  0x36ae696e __CFStringAppendFormatCore + 7998
3   CoreFoundation                  0x36a611d8 _CFStringCreateWithFormatAndArgumentsAux + 68
4   Foundation                      0x3595dc2e +[NSString stringWithFormat:] + 54
5   WIPTime                         0x0001572e -[NSDate(TKCategory) reportHeader] + 66
6   WIPTime                         0x0006bd9e -[ReportDelegate tableView:cellForRowAtIndexPath:] + 474
7   UIKit                           0x36de009c -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 540
8   UIKit                           0x36ddf17a -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1070
9   UIKit                           0x36dde904 -[UITableView layoutSubviews] + 200
10  UIKit                           0x36d830d8 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 176
11  CoreFoundation                  0x36a651f4 -[NSObject performSelector:withObject:] + 36
12  QuartzCore                      0x36241a9e -[CALayer layoutSublayers] + 210
13  QuartzCore                      0x362416b6 CA::Layer::layout_if_needed(CA::Transaction*) + 210
14  QuartzCore                      0x3624583c CA::Context::commit_transaction(CA::Transaction*) + 220
15  QuartzCore                      0x36245578 CA::Transaction::commit() + 308
16  QuartzCore                      0x3623d4b2 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 50
17  CoreFoundation                  0x36adab14 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12
18  CoreFoundation                  0x36ad8d50 __CFRunLoopDoObservers + 252
19  CoreFoundation                  0x36ad90aa __CFRunLoopRun + 754
20  CoreFoundation                  0x36a5c49e CFRunLoopRunSpecific + 294
21  CoreFoundation                  0x36a5c366 CFRunLoopRunInMode + 98
22  GraphicsServices                0x30b3e432 GSEventRunModal + 130
23  UIKit                           0x36dade76 UIApplicationMain + 1074
24  WIPTime                         0x00003032 main + 42
25  WIPTime                         0x00002ffc start + 32

реализация reportHeader следующая:

  -(NSString *) reportHeader
    {
    NSString *realWorld=[self dateDescriptionRealWorld];
    NSString *year=[self yearString];
    NSString *weekDay=[self weekdayString];
    NSString *returnString=[NSString stringWithFormat:@"%@ %@ %@",weekDay,realWorld,year];

    return returnString;
    }

В этом методе используются следующие служебные методы:

-(NSString *) dateDescriptionRealWorld
{

    return [NSString stringWithFormat:@"%@ %@",[self dayString],[self monthStringWithCod]];
}

- (NSString*) monthString{
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
    [dateFormatter setDateFormat:@"MMMM"];
    return [dateFormatter stringFromDate:self];
}

- (NSString*) yearString{
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
    [dateFormatter setDateFormat:@"yyyy"];
    return [dateFormatter stringFromDate:self];
}

- (NSString*) dayString{
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
    [dateFormatter setDateFormat:@"dd"];
    return [dateFormatter stringFromDate:self];
}

- (int) weekday{

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:self];
    int weekday = [comps weekday];
    [gregorian release];
    return weekday;
}

-(NSString *) weekdayString
{
    NSDate *date=self;
    int weekday=[date weekday];
    if (weekday ==0) {
        return @"Sat";
    }
    else if(weekday ==1)
    {
        return @"Sun";
    }
    else if(weekday ==2)
    {
        return @"Mon";

    }
    else if(weekday ==3)
    {
        return @"Tue";

    }
    else if(weekday ==4)
    {
        return @"Wed";

    }
    else if(weekday ==5)
    {
        return @"Thu";

    }
    else if(weekday ==5)
    {
        return @"Fri";

    }

}

person Masud alam    schedule 27.03.2012    source источник
comment
monthStringWithCod присутствует, верно?   -  person Ilanchezhian    schedule 27.03.2012
comment
да, он вызывает другой метод кода. Я немедленно отправлю код   -  person Masud alam    schedule 27.03.2012


Ответы (2)


Где на картинке фигурирует переменная realWorld? Я подозреваю, что это поле класса, которому вы присваиваете результат вызова dateDescriptionRealWorld, но никогда не сохраняете. Однако это всего лишь предположение, основанное на неполной информации.

person Marcelo Cantos    schedule 27.03.2012
comment
извините за ошибку. это не поле класса. Я просто забыл добавить строку в код этого вопроса. - person Masud alam; 27.03.2012
comment
Но приложение работает на симуляторе ios и устройстве iOS, похоже, я не могу найти сбоев. - person Masud alam; 27.03.2012

Несколько мыслей ... Вы должны использовать switch / case и регистр по умолчанию вместо if / else. Кроме того, вы неправильно называете свои методы. Вместо метода буднего дня вы должны назвать его в честь того, что он делает, и возвращает, например, weekdayFormatted. Кроме того, вам, вероятно, не следует выделять новый dateFormatter в каждом методе, а использовать один NSDateFormatter в своем классе и устанавливать его формат в каждом из этих методов.

Я предлагаю удалить все ваши методы и поместить форматирование в метод reportHeader, чтобы очистить его. Вы выделяете довольно много ресурсов, и хотя вы используете автозапуск, вы слишком полагаетесь на него, чтобы очистить, иначе, возможно, неразумное управление памятью.

Возможно, это не слишком «практичное» быстрое решение для вас, но я вижу те вещи, которые могут привести к лучшему управлению памятью.

Также - у @Aadihira есть отличный вопрос, и вам также следует показать метод monthStringWithCod.

person Brooks Hanes    schedule 27.03.2012