IOS: fatal exception: NSRangeException

The application works fine before updating iOS 11. After deploying iOS 11, some users get it lower, but I can’t reproduce it in the iOS 11 simulator. Based on fabric.io, not all iOS 11 experience this, so far I have received only 22 reports crashes from 4 users. Need help here, thanks.

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

this piece of code

- (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;
}
+4
source share
5 answers

Not a complete solution, but if he tries to delete an object at index 9223372036854775807, it is worth noting that this is not a random number, but the maximum value of a 64-bit integer may contain

- , - . , .dysm Fabric, ( , ) , ..,

+2

, "", , .

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

iOS11 iPhone 6S, .

- , ... Apple, , .

+2

-, ?...

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

to

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.

You have the opportunity to check the contents nib. Does it contain the requested view or is it empty? If an empty name check your xib file. I personally prefer to write the xib name in something like NSStringFromClass([self class])- because it requires the same name for the class file and xib, but less error prone.

+1
source

You have the wrong setup view from nib. You can use my library or see the code on how to add components from xib.

RMNibLoadedView

+1
source

Maybe you assigned 2 collectors for the same property?

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

It should look like:

self.inputDatePicker = [nib objectAtIndex:0];
self.inputDatePicker.frame = CGRectMake(0, 0, self.view.frame.size.width, 260);
-2
source

Source: https://habr.com/ru/post/1687006/


All Articles