8

これを行う必要がありますか:

+(void)initialize{
     ...my stuff...
  [super initialize];
 }

つまり、App Delegate でinitialize親クラス ( NSObject) からオーバーライドしている場合、スーパー実装も呼び出されるようにする必要がありますか? それとも、これはインスタンスメソッドではないので当てはまりませんか?

この方法はどれほど「安全」ですか?私は iNotify ライブラリを実装しており、ドキュメントではこのメソッドにセットアップを追加することが提案されていますが、以前はアプリ内で使用したことがなく、予期せず他の何かと競合する可能性があるかどうかも知りたいですか?

4

2 に答える 2

7

このクラスのサブクラスがある場合は、各サブクラスがこのメソッドを再度呼び出すため、dispatch_once ステートメントを使用してコードを呼び出すことをお勧めします

+(void)initialize
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        //Your Code
    });
}

詳細については、Mike Ash によるこのブログ投稿を参照してください。

于 2012-07-19T07:27:41.390 に答える
0

ランタイムは、クラス、またはそれを継承する任意のクラスがプログラム内から最初のメッセージを送信される直前に、プログラム内の各クラスに initialize を送信します。ランタイムは、初期化メッセージをスレッドセーフな方法でクラスに送信します。スーパークラスは、サブクラスの前にこのメッセージを受け取ります。サブクラスが初期化を実装していない場合 (ランタイムが継承された実装を呼び出す場合)、またはサブクラスが [super initialize] を明示的に呼び出す場合、スーパークラスの実装は複数回呼び出される可能性があります。複数回実行されるのを防ぎたい場合は、次の行に沿って実装を構成できます。

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/reference.html#//apple_ref/occ/clm/NSObject/initialize

したがって、両方を作成します

+ (void)initialize
{
    ...
}

+ (void)initialize
{
    [super initialize];

    ...
}

有効。

于 2014-05-26T14:05:28.667 に答える