2009-07-16 4 views
0

私は起動アニメーションを行う方法があります。このメソッドは、アプリケーションの使用中に何度も呼び出されますが、最初の呼び出しでは、さらに特別なことを行う必要があります。アプリの起動後初めてメソッドが呼び出された場合、そのメソッドを判別する最も簡単な方法は何ですか?

シングルトンは行く方法ですか?おそらく、このメソッドが何回呼び出されたかを測定し、それをivarに格納する代わりに、より良い方法があるかもしれません。

答えて

7
- (void)someMethod { 
    static BOOL hasBeenCalledBefore = NO; 
    if (!hasBeenCalledBefore) { 
     // perform setup 
     hasBeenCalledBefore = YES; 
    } 
    // do other stuff 
} 

スレッドを使用している場合は余分な作業が必要になることがありますが、それは基本的な考えです。

+0

これは、クラスが複数の(しかし異なる)クラスローダによってロードされる状況を処理しません。シングルトンは、単一のクラスローダーのためだけに保持されます。コードがコンテナ内で実行される場合、複数のJVMで実行されている可能性があり、それぞれが唯一のものだと思うかもしれません。それは本当にあなたが数えたり/保護しようとしているものに依存します。上記のクラスローダー/ JVMの問題のために、リソースのロックに関するJavaの選択肢は最善ではありません。 –

+0

@Kelly:これはJavaではありません。 Objective-Cです。私はiPhoneがJavaを実行できるとは思わない。 – Chuck

2

なぜ初期化コードがコンストラクタにありませんか?たぶんあなたは、あなたが言及するinitブロックを処理するためにコンストラクタを使用する独自のクラスにそのメソッドを因数分解する必要があります。 (ほとんど正しい)

2

改正チャックにの答えは

彼の作品とは、あなたの質問に答える、しかし、あなたが使用できる別のオプションは、(それがそのメソッドに渡される変数のいずれかへのアクセスを必要としなかったと仮定した場合)あなたのメソッドからコードを取り出し、それを静的初期化子に入れることです。クラスが最初にロードされたときにのみ実行され、本質的に完全に異なるコード部分を分離します。

新しいクラスが呼び出される場合は、Chuckの答えを使用しますが、メンバー変数を使用するか、クラス初期化子を使用してください。

関連する問題