IOS:致命exception:NSRangeException

该应用程序在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; } 

不是一个完整的解决scheme,但如果它试图删除索引9223372036854775807的对象,值得指出的不是一个随机数,它是一个64位整数可以容纳的最大值

所以有些地方可能会陷入一个循环,或者沿着这个循环。 如果您还没有将.dysmfile upload到Fabric,它会给您提供更多的信息性的崩溃报告(甚至从您已经有的报告)与函数名称,variables等,所以你可以精确定位到代码更准确

我们在应用程序中看到了同样的问题,并且可以通过在设置任何其他dateselect器属性之前将dateselect器的日历types设置为“公历”来解决问题。

 self.inputDatePicker = [[DatePickerView alloc] init...]; self.inputDatePicker.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] self.inputDatePicker.datePicker.datePickerMode = UIDatePickerModeDate; self.inputDatePicker.delegate = self; 

通过将用户的日历更改为佛教徒,我们在iOS11 iPhone 6S上进行了复制。

出于某种原因,如果我们在设置dateselect器模式之后设置日历,那么应用程序会崩溃…似乎是一个苹果的错误,迫使开发人员不得不考虑我们设置属性的顺序。

首先 – 为什么你在这里设置两次财产?

 self.inputDatePicker = [[DatePickerView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 260)]; self.inputDatePicker = [nib objectAtIndex:0]; 

如果你想确保这个属性不是零,只要检查返回的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文件使用相同的名字,但是却不太容易出错。

你从nib的设置视图有错误。 您可以使用我的库或观看代码如何从xib添加组件。

RMNibLoadedView

可能是,你把同一个房产分配了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);