OSDN Ticket Archive


Ticket #46257

iOS版 ゲームコントローラを接続/切断するとクラッシュする

登録: 2022-12-11 00:06 最終更新: 2022-12-11 00:48

報告者:
yknk
担当者:
yknk
チケットの種類:
バグ
状況:
完了
コンポーネント:
MIDITrail Ver.2.x.x for iOS
マイルストーン:
Version 2.0.0 for iOS (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

ゲームコントローラを接続または切断するとMIDITrailがクラッシュする。

クラッシュが発生箇所は以下の通り。

MTSettingViewCtrl:updateTableForGameController
---
//ゲームコントローラセクション(9)表示更新
pSections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(9, 1)];
[m_pTableView reloadSections:pSections withRowAnimation:UITableViewRowAnimationNone];  <-- ここで落ちる
---

クラッシュ発生時のデバッグログ

2022-12-09 00:11:41.935917+0900 MIDITrail[699:27310] [TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window. Table view: <UITableView: 0x11c817c00; frame = (0 0; 390 800); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x2811ea190>; backgroundColor = <UIDynamicSystemColor: 0x280a39780; name = systemGroupedBackgroundColor>; layer = <CALayer: 0x281f23c80>; contentOffset: {0, 1398.3333333333333}; contentSize: {390, 2159.3333333333335}; adjustedContentInset: {91, 0, 39, 0}; dataSource: <MTSettingViewCtrl: 0x101820000>>
2022-12-09 00:11:41.940401+0900 MIDITrail[699:27310] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], UITableView.m:2147
2022-12-09 00:11:41.943555+0900 MIDITrail[699:27310] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete section 9, but there are only 9 sections before the update'
*** First throw call stack:
(0x19f14de88 0x19847b8d8 0x199a69b4c 0x1a15b2f54 0x1a1572ea4 0x1a2170f28 0x100aab740 0x100aab66c 0x19f17b404 0x19f222474 0x19f205724 0x19f18fa08 0x199580ffc 0x209d39af0 0x10107c5a8 0x10107e05c 0x10108e810 0x10108e354 0x19f1de6f8 0x19f1c0058 0x19f1c4ed4 0x1d84c6368 0x1a16a33d0 0x1a16a3034 0x100a1497c 0x1bd830960)
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete section 9, but there are only 9 sections before the update'
terminating with uncaught exception of type NSException
(lldb) 

チケットの履歴

2022-12-11 00:06 更新者: yknk
  • 新しいチケット "iOS版 ゲームコントローラを接続/切断するとクラッシュする" が作成されました
2022-12-11 00:47 更新者: yknk
コメント

原因

Ver.1.2.4 で作り込まれた不具合。 ゲームコントローラの接続/切断が発生したとき、MTSettingViewCtrl:updateTableForGameController にて、 設定ビューのControllerセクションのGamepadセルを更新する処理で、更新対象に存在しないセクション番号9を指定していたため、クラッシュした。

ゲームコントローラに対応したのは Ver.1.2.3 であるが、この時点ではセクション番号の指定に問題はなかった。 しかし、Ver.1.2.4 の以下チケットの対応でセクションが2つ削除されたため、 Controllerセクションの番号がずれてしまい、本不具合が作り込まれた。

  • #39216 iOS版 設定ビューのセクション構成変更

また Ver.1.3.5 では、以下チケットの対応により、セクションが1つ追加されたが、 Controllerセクションの番号は Ver.1.2.3 時点の番号とは一致しないままだった。

  • #42794 iOS版 曲間待機時間の設定を追加
2022-12-11 00:47 更新者: yknk
コメント

対策

MTSettingViewCtrl:updateTableForGameController

更新対象のControllerセクションの番号として8を指定する。

再発防止のため、セクションの追加/削除を行うときは、updateTableForGameController の見直しが必要であることを、 以下メソッドのコメントに記載する。

  • MTSettingViewCtrl:tableView:titleForHeaderInSection
  • MTSettingViewCtrl:makeControllerCellForIndexPath
2022-12-11 00:48 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません