nsrange 左开右闭,IOS:致命异常:NSRangeException

The app work fine before iOS 11 update. After iOS 11 rollout, some user get this below crash but I cannot reproduce this in simulator iOS 11. Based on fabric.io, not all iOS 11 experiencing this, so far I only received from 22 crash report from 4 users. Need some 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 part of the program 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;

}

解决方案

We saw the same issue in our app and were able to fix by setting the date picker's calendar type to 'Gregorian' BEFORE setting any other date picker property, e.g.

self.inputDatePicker = [[DatePickerView alloc] init...];

self.inputDatePicker.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]

self.inputDatePicker.datePicker.datePickerMode = UIDatePickerModeDate;

self.inputDatePicker.delegate = self;

We reproduced on an iOS11 iPhone 6S by changing the user's calendar to Buddhist.

For some reason the app would crash if we set the calendar AFTER setting the date picker mode... seems like an Apple bug to force devs to have to think about the order in which we set our properties.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值