是否有任何原因导致 ECGraph 在模拟器上运行良好,但在我的设备上运行时却出现此错误:
2012-08-24 01:57:18.543 Portfolio[3538:907] *** -[__NSCFCalendar components:fromDate:toDate:options:]: fromDate cannot be nil
I mean really, what do you think that operation is supposed to mean with a nil fromDate?
An exception has been avoided for now.
A few of these errors are going to be reported with this complaint, then further violations will simply silently do whatever random thing results from the nil.
Here is the backtrace where this occurred this time (some frames may be missing due to compiler optimizations):
(
0 CoreFoundation 0x37a1d78f <redacted> + 86
1 Portfolio 0x000a0d1f -[ECGraph(Private) getDaysFrom:To:] + 202
2 Portfolio 0x000a1577 -[ECGraph(Private) getXDaysFromLines:minDate:] + 502
3 Portfolio 0x000a2623 -[ECGraph drawCurveWithLines:lineWidth:color:] + 978
4 Portfolio 0x000a716f -[GraphView drawRect:] + 2682
5 UIKit 0x38b1811d <redacted> + 364
6 QuartzCore 0x39468035 <redacted> + 112
7 QuartzCore 0x39467771 <redacted> + 1808
8 QuartzCore 0x39466f45 <redacted> + 980
9 QuartzCore 0x39466a7b <redacted> + 202
10 QuartzCore 0x3953a9f5 <redacted> + 24
11 QuartzCore 0x394663d3 <redacted> + 238
12 QuartzCore 0x39466119 <redacted> + 316
13 QuartzCore 0x3945dfe1 <redacted> + 60
14 CoreFoundation 0x37a4f18d <redacted> + 20
15 CoreFoundation 0x37a4d3f9 <redacted> + 276
16 CoreFoundation 0x37a4d74f <redacted> + 742
17 CoreFoundation 0x379cbc1d CFRunLoopRunSpecific + 356
18 CoreFoundation 0x379cbaa9 CFRunLoopRunInMode + 104
19 GraphicsServices 0x3a88f33b GSEventRunModal + 74
20 UIKit 0x38b35535 UIApplicationMain + 1120
21 Portfolio 0x00094e7d main + 152
22 Portfolio 0x00094de0 start + 40
)
您正在尝试从 nil NSDate 中获取 NSDateComponents,如下所示:
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate* fromDate = nil;
NSDate* toDate = [NSDate date];
unsigned int components = NSYearCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit;
NSDateComponents* dateComponents = [gregorian components:uintFlags fromDate:fromDate toDate:toDate options:0];
简单的检查可能会有用:
NSDate* fromDate = nil;
NSDate* toDate = [NSDate date];
NSDateComponents* dateComponents = nil;
if(fromDate != nil)
{
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
unsigned int components = NSYearCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit;
dateComponents = [gregorian components:uintFlags fromDate:fromDate toDate:toDate options:0];
}
您的设备使用的区域格式与模拟器不同。
如果您匹配这些(在
Settings -> General -> International
中),那么它们应该显示相同的结果。就我而言,在执行此操作时,它们都失败了,但模拟器没有提供与设备相同的日志,所以我几乎错过了它。
我假设您正在使用
NSDateFormatter
将一些字符串日期格式化为 NSDate ,就像我一样。在这种情况下,您必须确保这不会取决于手机所在的区域,并将解决方案设置为始终相同,无论您身在何处。
[df setLocale:([[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"])];
// df being the NSDateFormatter-object
这告诉格式化程序使用英国标准进行格式化,这在我的情况下是需要的。输入您需要的国家代码,即
en_US
等
斯蒂