4

アプリケーションデリゲートのアプリケーションdidFinishLaunchingメソッドの前に、ビューコントローラーのinitWithCoderメソッドの一部が呼び出される場合があります。(ブレークポイントを設定し、呼び出しのシーケンスを確認することで、これを確認しました)

絵コンテを使っています。UITabBarControllerは、最初のビューコントローラーです。問題の一部は、ストーリーボードが未知の順序でオブジェクトを作成することです。アプリの起動が完了する前に、ViewControllerを作成している可能性があります。

いずれにせよ、問題は私が最初のユーザーデフォルトを登録していることです。これは、プログラムのいずれかの部分がそれらを見る前に発生する必要があります。そこで、登録コードが最初に実行されることが保証される場所を見つけようとしています。

そのような場所はありますか?

注:このスレッドでは少し説明していますが、実際には結論はありません...

ViewDidLoadは、AppDelegatedidFinishLaunchingWithOptionsが実行される前に実行されます。

4

2 に答える 2

4

ユーザーのデフォルトを初期化する標準的な方法は、アプリデリゲートの「+(void)initialize」メソッドです。

+ (void)initialize
{
    if(self == [MyAppDelegate class]) {
        ...
    }
}

これは、デリゲートメソッドがメッセージを受け取る前に実行されることが保証されています。

PS:そのメソッドから戻る前に、didLaunchメソッドで多数のviewControllerをインスタンス化します。

于 2012-08-07T17:39:41.557 に答える
0

これは当然のことです(そして、InterfaceBuilderを使用する理由の1つでもあります)。application:didFinishLaunchingWithOptionsの場合:通常、メインウィンドウとメインビューコントローラーは、対応するNIB/XIBファイルから既に作成されていることに依存します。2つの解決策:

1つ(推奨):application:didFinishLaunchingWithOptions:で手動でインスタンス化します。したがって、初期化の実行順序を制御できます。

2つ:__attribute__((constructor(XXX)))関数を使用する-mainの前に呼び出されることが保証されており、XXX番号が小さいほど、特定のコンストラクター関数が早く呼び出されます。ただし、この方法は標準のC(コンパイラ拡張のみ)ではなく、非常に混乱しやすいため、お勧めできません。

于 2012-08-07T17:27:28.323 に答える