[英]Crash issue for [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";
}
}
变量realWorld
出现在哪里? 我怀疑这是您分配调用dateDescriptionRealWorld
的结果的类字段,但是从不保留。 但是,这只是基于不完整信息的猜测。
几点思考...您应该使用switch / case和默认大小写而不是if / else。 此外,您在错误地命名您的方法。 而不是工作日方法,您应该以它的作用并返回它来命名,例如weekdayFormatted。 另外,您可能不应该在每种方法中分配新的dateFormatter,而应在类中使用一个NSDateFormatter,并在每种方法中设置其格式。
我建议删除所有方法,并将格式放入reportHeader方法中,以进行清理。 您分配了很多东西,尽管您使用了自动释放,但您对它的依赖太大了,否则可能会清理不明智的内存管理。
对于您来说,这可能不是太“实用”的快速解决方案,但是我看到的那些事情可能会导致更好的内存管理。
另外-@Aadihira有一个很大的问题,您还应该显示monthStringWithCod方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.