Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 0]'
先日、iOSアプリのクラッシュログで以下が発見された
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 0]'
クラッシュが発生している部分のコードはnavigationController
のviewControllers
から、表示している画面の1つ前の画面を取得するという内容で
if let navi = self.navigationController { navi.viewControllers[navi.viewControllers - 2] }
といった具合。
どう考えてもindex がこんな値(18446744073709551615)になるなんてことはありえない。
しかもこれ、ちょうど16EBだし。
ありえるとしたら、index 値がマイナスになってクラッシュが発生するぐらい。
NSArray のsubscript 実装のミスなんじゃないか? と思ったので、試しに適当なProject で下記を実行。
let array: NSArray = [] array[-1]
結果は
2020-01-15 22:59:48.109746+0900 XXXXX[98836:9319497] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 18446744073709551615 beyond bounds for empty NSArray'
なるほどな。。。