2012-03-27 349 views
1

我将我的应用程序提交给苹果进行审查。苹果拒绝并给了我下面的崩溃报告。[NSString stringWithFormat]的崩溃问题:

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

    } 

} 
+3

这是一个崩溃,而不是泄漏。 – 2012-03-27 11:37:29

+0

'monthStringWithCod'存在,对不对? – Ilanchezhian 2012-03-27 12:22:44

+0

是的,它调用了另一种代码方法。我会立即发布代码 – 2012-03-27 13:27:20

回答

0

哪里变realWorld进入了吗?我怀疑这是一个班级领域,你分配调用dateDescriptionRealWorld的结果,但从来没有保留。但这只是一个猜测,基于不完整的信息。

+0

对于这个错误感到抱歉。它不是一个类字段。我只是忘了将此行添加到此问题的代码中。 – 2012-03-27 11:53:17

+0

但是该应用程序运行在ios模拟器上,并且ios设备也无法找到任何崩溃。 – 2012-03-27 12:03:45

0

一些想法...你应该使用开关/大小写,而不是if/else的默认情况。另外,你错误地命名你的方法。不要使用星期几方法,你应该在它做了什么并返回后将其命名,例如weekdayFormatted。另外,你可能不应该在每个方法中分配一个新的dateFormatter,而是在你的类中使用一个NSDateFormatter,并在每个方法中设置它的格式。

我建议删除所有的方法,并将格式放入reportHeader方法中,以清理它。你正在分配相当多的东西,尽管你使用autorelease,但你依靠它太多的清理,否则可能是不明智的内存管理。

这对你来说可能不是太“实用”的快速修复,但这些都是我看到的可能导致更好的内存管理的事情。

另外 - @Aadihira有一个很好的问题,你也应该显示monthStringWithCod方法。

+0

感谢您的建议 – 2012-03-27 13:29:24