興味深い問題が発生しており、誰かが光を当てることができるのではないかと思います。現在、警告が表示"Method never reaches end or 'return' statement"
されています: イベント ハンドラー デリゲート コールバックで、かなり奇妙です。
SCB_
次のコードを検討してください (関数は無視できます。質問には関係ありません)。
public static class NativeBridge
{
private static UnityEventQueue _eventQueue;
private static bool _initialized;
public static void Init()
{
if (_initialized)
{
return;
}
_initialized = true;
SCB_SDKInit();
_eventQueue = UnityEventQueue.Instance;
_eventQueue.AppExiting += EventQueue_AppExiting;
SCB_registerReceivedSistrCallback(SistrReceived);
}
//Lots of other irrelevant code
private static void EventQueue_AppExiting(object sender, EventArgs e)
{
SCB_registerReceivedSistrCallback(null);
_eventQueue.AppExiting -= EventQueue_AppExiting;
SCB_SDKFinal();
_initialized = false;
}
}
警告がオンになっていEventQueue_AppExiting
ます。ここが奇妙な部分です。登録解除をコメントアウトすると_eventQueue.AppExiting -= EventQueue_AppExiting
、警告が消えます。
コンパイラの到達不能パスのバグのように見えるものに対して、さまざまな「解決策」を試しました。
- 静的クラスを非静的にし、それに応じて調整します
- を静的にし、それに応じて調整
event
しますUnityEngineQueue
- コールバック メソッドの最後に登録解除イベントを配置します。
void
SCB_
関数の呼び出しをサニティ チェックにコメント アウトします。- その他のさまざまな
Spaghetti at the wall
ソリューション
上記のすべてで、コンパイラの動作に変化はありませんでした。私たちの最善の推測は、コンパイラーが登録解除を検出し、デリゲートが削除されているため、実行時に実行を完了できないと考えていることです。ただし、呼び出しが既に開始されているため、スタックは削除後も実行を継続する必要があると思います。
これがアプリケーションの実行に悪影響を及ぼしているようには見えませんが、イベントの呼び出し条件 (アプリケーションの終了) の性質上、デバッグが困難です。
コンパイラは何を見ているのでしょうか、そして/または私たちが間違っている可能性があるのは何ですか?
P.S.
コンテキストを少し説明すると、このクラスは、同様の API を使用してさまざまなプラットフォーム固有のライブラリへstatic
のブリッジとして機能するためです。extern
しかし、その事実は質問とはほとんど関係がなく、「EWWWW 静的クラス」の感情を鎮めるためのものです。