+loadと+initializeの違い

1550 ワード

まず呼び出しタイミングが異なり,全く異なる呼び出し原理が決定され,大きな違いが形成される.

前に書いてあると


+loadでサードパーティ製のライブラリを初期化しないほうがいいです.appの起動に時間がかかり、失敗する可能性があります.自分のビジネスロジックは+loadの代わりに+initializeを多く使用します.

呼び出しタイミング

  • +loadメソッドはruntimeがクラスと分類をロードするときに自動的に呼び出され、一度だけ呼び出されます.メッセージを通らないsend()がトリガーされ、load_を通過します.methodという構造体のIMPは直接実行され,OCのメッセージ配信メカニズムに合わない.
  • +initializeメソッドは、クラスがメッセージを初めて受信したときに呼び出され、サブクラスがメソッドを実装していない場合、親クラスの+initializeメソッドは複数回呼び出されます.メッセージを通してsendトリガは、OCのメッセージ配信メカニズムに合致する.

  • 継承と分類の呼び出し順序。

  • +loadの呼び出し順序
  • 1.先にクラスを呼び出す+loadコンパイル順にサブクラスを呼び出す+loadを呼び出す前に親クラスの+loadを呼び出す
    2.再呼び出し分類の+loadはコンパイル順に呼び出す(先にコンパイル、先に呼び出す)と継承は関係ありません
  • +initializeの呼び出し順序1.子クラスの+initializeメソッドを呼び出すと、親クラスの+initializeメソッドが先に呼び出され、親クラスの+initializeメソッドが複数回呼び出されますが、親クラスを複数回初期化することはありません.呼び出しごとに初期化されるのは子クラス呼び出し者のインスタンスオブジェクトなので、各クラスは1回のみ初期化されます(たとえば、異なる子クラスが初期化される前に親クラスは1回のみ初期化されます).2.分類は元のクラス+initializeメソッドの実装を上書きします.

  • 用途

  • +loadはmain関数の前に重要なデータを初期化するのによく使われますが、起動時間に影響します.1回の関数とよく組み合わせて使用し、手動で+loadメソッドを複数回呼び出すことを防止します.
  • + (void) load
    {
        static dispatch_once_t token;
        dispatch_once(&token, ^{
           // init......
        });
    }
    
    
  • initializeは、いくつかのクラスの初期化情報のロードを怠ったり、KVOリスニング、登録通知、runtimeメソッドの交換を登録したりするために使用されます.1回の関数とよく組み合わせて使用され、サブクラスが複数回呼び出されると、いくつかのデータが複数回作成されないようにし、推奨されます.
  • + (void)initialize
    {
        static dispatch_once_t token;
        dispatch_once(&token, ^{
           // init......
        });
    }
    

    もし間違いや新しい見解があれば、コメントエリアで約束してください.