在iOS 11更新之前,应用程序正常运行。在iOS 11推出之后,一些用户得到了以下崩溃但我无法在模拟器iOS 11中重现这一点。基于fabric.io,并非所有iOS 11都经历过这种情况,到目前为止我只收到了来自4个用户的22个崩溃报告。需要一些帮助,谢谢。
Fatal Exception: NSRangeException
*** -[__NSArrayM objectAtIndex:]: index 9223372036854775807 beyond bounds [0 .. 1]
Fatal Exception: NSRangeException
0 CoreFoundation 0x185b7fd38 __exceptionPreprocess
1 libobjc.A.dylib 0x185094528 objc_exception_throw
2 CoreFoundation 0x185b18c44 _CFArgv
3 CoreFoundation 0x185a48cc0 -[__NSArrayM removeObjectAtIndex:]
4 UIKit 0x18f1e4aa8 -[UIPickerView selectedRowInComponent:]
5 UIKit 0x18fa4a224 -[_UIDatePickerMode_Date _dateForYearRow:]
6 UIKit 0x18fa46dd8 -[_UIDatePickerMode dateForRow:inCalendarUnit:]
7 UIKit 0x18fa47a70 -[_UIDatePickerMode _updateSelectedDateComponentsWithNewValueInComponent:usingSelectionBarValue:]
8 UIKit 0x18fa47d18 -[_UIDatePickerMode selectedDateComponents]
9 UIKit 0x18fa3b370 -[_UIDatePickerView _updatedLastSelectedComponentsByValidatingSelectedDateWithLastManipulatedComponent:]
10 UIKit 0x18fa3a7e8 -[_UIDatePickerView _setDate:animated:forced:]
11 UIKit 0x18fa3ad24 -[_UIDatePickerView _setMode:]
12 UIKit 0x18fa3ae40 -[_UIDatePickerView setDatePickerMode:]
13 UIKit 0x18f4f51d8 -[UIDatePicker initWithCoder:]
14 UIKit 0x18f6bf588 UINibDecoderDecodeObjectForValue
15 UIKit 0x18f6bf2c0 -[UINibDecoder decodeObjectForKey:]
16 UIKit 0x18f51652c -[UIRuntimeConnection initWithCoder:]
17 UIKit 0x18f516d00 -[UIRuntimeEventConnection initWithCoder:]
18 UIKit 0x18f6bf588 UINibDecoderDecodeObjectForValue
19 UIKit 0x18f6bf700 UINibDecoderDecodeObjectForValue
20 UIKit 0x18f6bf2c0 -[UINibDecoder decodeObjectForKey:]
21 UIKit 0x18f5158a0 -[UINib instantiateWithOwner:options:]
22 UIKit 0x18f51d64c -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:]
23 xxxxxxxxxxxxxxxxxxxxxxxxxx 0x1030445f0 -[VerifyAccountViewController viewDidLoad] (VerifyAccountViewController.m:47)
24 UIKit 0x18ef8fbfc -[UIViewController loadViewIfRequired]
25 UIKit 0x18efa8318 -[UIViewController __viewWillAppear:]
26 UIKit 0x18f114ee0 -[UINavigationController _startCustomTransition:]
27 UIKit 0x18f036e04 -[UINavigationController _startDeferredTransitionIfNeeded:]
28 UIKit 0x18f036a34 -[UINavigationController __viewWillLayoutSubviews]
29 UIKit 0x18f03695c -[UILayoutContainerView layoutSubviews]
30 UIKit 0x18ef8d000 -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
31 QuartzCore 0x189b5d0b4 -[CALayer layoutSublayers]
32 QuartzCore 0x189b61194 CA::Layer::layout_if_needed(CA::Transaction*)
33 QuartzCore 0x189acff24 CA::Context::commit_transaction(CA::Transaction*)
34 QuartzCore 0x189af6340 CA::Transaction::commit()
35 UIKit 0x18f1f3744 _UIApplicationFlushRunLoopCATransactionIfTooLate
36 UIKit 0x18f8d2718 __handleEventQueueInternal
37 UIKit 0x18f8cb574 __handleHIDEventFetcherDrain
38 CoreFoundation 0x185b28358 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
39 CoreFoundation 0x185b282d8 __CFRunLoopDoSource0
40 CoreFoundation 0x185b27b60 __CFRunLoopDoSources0
41 CoreFoundation 0x185b25738 __CFRunLoopRun
42 CoreFoundation 0x185a462d8 CFRunLoopRunSpecific
43 GraphicsServices 0x1878d7f84 GSEventRunModal
44 UIKit 0x18eff3880 UIApplicationMain
45 xxxxxxxxxxxxxxxxxxxxxxxxxx 0x103090ee4 main (main.m:13)
46 libdyld.dylib 0x18556a56c start
程序代码的这一部分
- (void)viewDidLoad {
[super viewDidLoad];
storyboard = [UIStoryboard storyboardWithName:@"FirstTimeSetup" bundle:nil];
dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setTimeZone:[NSTimeZone systemTimeZone]];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DatePickerView" owner:self options:nil]; //here is (VerifyAccountViewController.m:47)
self.inputDatePicker = [[DatePickerView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 260)];
self.inputDatePicker = [nib objectAtIndex:0];
self.inputDatePicker.datePicker.datePickerMode =UIDatePickerModeDate;
self.inputDatePicker.delegate = self;
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Skip" style:UIBarButtonItemStylePlain target:self action:@selector(skipAction:)];
self.navigationItem.rightBarButtonItem = item;
}
答案 0 :(得分:6)
我们在应用程序中看到了同样的问题,并且能够通过在设置任何其他日期选择器属性之前将日期选择器的日历类型设置为“Gregorian”来修复,例如
self.inputDatePicker = [[DatePickerView alloc] init...];
self.inputDatePicker.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]
self.inputDatePicker.datePicker.datePickerMode = UIDatePickerModeDate;
self.inputDatePicker.delegate = self;
我们通过将用户的日历更改为佛教徒来在iOS11 iPhone 6S上复制。
由于某些原因,如果我们在设置日期选择器模式后设置日历,应用程序会崩溃...似乎是一个苹果错误,迫使开发人员必须考虑我们设置属性的顺序。
答案 1 :(得分:3)
不是一个完整的解决方案,但如果它试图删除索引号为9223372036854775807的对象,那么值得指出的是它不是一个随机数the maximum value a 64 bit integer can hold
所以某个地方可能会陷入一个循环,或者沿着那些路线。如果您还没有,请将.dysm文件上传到Fabric,它将为您提供更多信息性的崩溃报告(甚至来自您已有的报告),包括函数名称,变量等,以便您可以更准确地查找代码
答案 2 :(得分:1)
首先 - 为什么你在这里设置两次属性?...
self.inputDatePicker = [[DatePickerView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 260)];
self.inputDatePicker = [nib objectAtIndex:0];
如果你想确保这个属性不是nil,只需检查返回的nib数组,如果它是空的,则执行其他操作。
根据崩溃日志,您在尝试获取某些值之前清理了数组。所以尝试改变
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DatePickerView" owner:self options:nil]; //here is (VerifyAccountViewController.m:47)
self.inputDatePicker = [[DatePickerView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 260)];
self.inputDatePicker = [nib objectAtIndex:0];
到
self.inputDatePicker = [[[NSBundle mainBundle] loadNibNamed:@"DatePickerView" owner:self options:nil] firstObject];
if (self.inputDatePicker == nil) {
// do something or perhaps better to check you nib
}
关于FirstObject。
您是否有机会查看nib
内容。它是否包含请求的视图或它是空的?如果是空的检查xib文件的名称。我个人更喜欢在NSStringFromClass([self class])
之类的内容中编写xib的名称 - 因为这需要类和xib文件的相同名称,但不容易出错。
答案 3 :(得分:0)
你在nib的设置视图上有错误。您可以使用我的库或观察代码如何从xib添加组件。
答案 4 :(得分:-3)
可能是,您将2个选择器分配给同一个属性?
self.inputDatePicker = [[DatePickerView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 260)];
self.inputDatePicker = [nib objectAtIndex:0];
它应该像:
self.inputDatePicker = [nib objectAtIndex:0];
self.inputDatePicker.frame = CGRectMake(0, 0, self.view.frame.size.width, 260);