2017-03-15 14 views
0

オーバーライドinitialize()クラスが最初のメッセージを送信する前に(等UserDefaults設定)コードを実行するための一般的であり、複数回実行されるコードに対する保護します。ドキュメントには、スーパークラスの実装が複数回のサブクラスがinitialize()をオーバーライドし、initialize()が複数回呼び出された場合、複数回のコードを実行してからクラスを保護するための方法の例を与えていないと呼ばれることができることを述べている:オーバーライドはAppDelegateに初期化 -

サブクラスがinitialize()を実装していない場合、実行時に継承された実装が呼び出される場合、またはサブクラスが明示的に[super initialize]を呼び出す場合、スーパークラスの実装は複数回呼び出される可能性があります。あなたが複数回実行されることから、自分自身を保護したい場合は、これらの線に沿って実装を構築することができます

+ (void)initialize { 
    if (self == [ClassName self]) { 
    // ... do the initialization ... 
    } 
} 

私はAppDelegateでinitialize()をオーバーライドし、複数回のコードの実行を避けるためにしようとしています。 self is AppDelegate.Typeが常にtrueに評価されているかどうかをチェックする(そして私にXcodeで警告が表示される)ので、クラスチェックはわかりません。

私たちはスーパークラスではないので、クラスチェックは適用されません(AppDelegateのスーパークラスはUIResponderです)?オーバーライドされたinitialize()メソッドの内容は、superを呼び出すことなく、またはクラスチェックを実行することなく1回だけ実行されますか?

+0

あなたはそれがAppDelegate' 'のサブクラスのためにtrueを返しませんis' ==='ではなく ''で使用している場合、私は思います。 – dan

+0

@danええと、私は参考文献を比較することは考えていませんでした。これも良い選択肢であり、サブクラスを保護します。それを回答として投稿するべきです。 – JAL

+0

または 'if self == AppDelegate.self'です。しかし、AppDelegateをサブクラス化しない限り、そのチェックは必要ありません。 –

答えて

0

あなたは通常、一度だけ(ドキュメントごとなど)initialize上でコードを実行するため、クラスのチェックのための理由があります。その状態を記述すると、initializeを実装していないサブクラスまたは[super initialize]を呼び出すことから保護されます。

class Animal: NSObject { 
    class func initialize() { 
     //Some code I only want to run once 
    } 
} 


class Dog: Animal {} 

私は新しいDogをインスタンス

は、Objective-Cランタイムは、そう Dogが届きます(最初のスーパークラス) Dogの階層に すべてのクラスinitialize方法をお送りします:ここでは例のクラス階層ですメッセージですが、そうなるでしょう AnimalDoginitializeを実装していないため、そのスーパークラスはメッセージを受信するため、メッセージがそのクラス用であることを確認するチェックを追加しないと、コードは2回実行されます。

doesn't really make sense in Swift AppDelegateでは、Swiftでコードを1回だけ実行したい場合は、the migration docsで定義されているように、遅延初期化グローバルまたは静的プロパティを使用することをお勧めします。

関連する問題