yujiro's blog

「インターネット上で正しい答えを得る最善の方法は、質問することではない。間違った答えを投稿することだ」by ウォード・カニンガム

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

クラッシュが発生している部分のコードはnavigationControllerviewControllers から、表示している画面の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'

なるほどな。。。