1

一貫して再現するのに苦労しているバグが発生しています。オブジェクトをキャストしていないという事実に関係していると思いますが、100%確信はありません。

UINavigationController *navController = [self navigationController];
MainGameViewController *controller = [navController.viewControllers objectAtIndex:2];

controller.phase = @"READY";

objectAtIndex:2 が常に MainGameViewController 型のオブジェクトを返すことはわかっていますが、キャストされていないことが一貫性のないエラーの原因になる可能性はありますか? エラーは、私が提供した 3 行目で発生します。

トレースは次のとおりです。

0   CoreFoundation                  0x3a6703e2 __exceptionPreprocess + 158
1   libobjc.A.dylib                 0x394fc95e objc_exception_throw + 26
2   CoreFoundation                  0x3a673f2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 180
3   CoreFoundation                  0x3a672648 ___forwarding___ + 388
4   CoreFoundation                  0x3a5ca204 _CF_forwarding_prep_0 + 20
5   AppName                     0x0003af56 -[ResultViewController BackToMainGameView] (ResultViewController.m:286)

エラーはクラス ResultsViewController で発生します。

4

2 に答える 2

2

いいえ、キャスティングは問題とは何の関係もありません。例外が発生する理由は、インデックス 2 のオブジェクトの型が間違っている場合があるためです。エラーが一貫して発生しないという事実は、追加の手がかりです。この問題を解決するには、ゲーム コントローラが 2 番目のインデックスにない状況を探してください。

一般に、キャストは、オブジェクトの型についてコンパイラに伝えるのに役立ちます。Objective C の動的な性質を考えると、これは、たとえば C++ よりもはるかに重要ではありません。

于 2013-01-03T05:59:10.760 に答える
0

オブジェクトをキャストしていないという事実に関係していると思いますが、100%確信はありません。

いいえ。キャストはコンパイラをだますためだけのものです (この特定のケースでは)。オブジェクトの実際のクラスは実行時に決定されます。オブジェクトが送信されたメソッドを実装していないため、例外が発生します。これは、期待されるクラスではないためです。

于 2013-01-03T06:00:56.760 に答える