2012-01-18 16 views
1

+(void)initializeメソッドを実装するクラスFooがあります。私はFooのサブクラスであるクラスも持っています。サブクラスをインスタンス化すると、initializeメソッドもFooで呼び出されてしまいます。これをどうやって防ぐのですか?目的関数-cのサブクラス化メソッド

ありがとうございました。

+0

サブクラスの 'init'メソッドで' self = [super init] 'をしないと思っていますか? – petert

+0

彼はクラス 'initialize'について話していると思いますが、もし本当に' init'を参照しているのであれば、それは正しいです。 –

+0

+(void)initialize – JPC

答えて

0

を私は初期化の実装とだけではなく、セットアップメソッドを呼び出していないことによってそれを解決してきました

+0

コスティクの答えは良いですし、またアップルの推奨する方法です。一度しかセットアップメソッドを呼び出すことは、複数のスレッドが存在する場合には驚くほど困難であり、その目的のために初期化が行われます。 – fishinear

+0

Fishinear、bbumはそうでないと言いますが、通常は正しいです(http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/) –

1

サブクラスにも+ (void)initializeを実装する必要があります。通常、人々は[super initialize]と呼んでいますが、そのステップをスキップする必要があります。空の方法はFooの呼び出しを防ぎます。

EDITスーパークラスinitializeメソッドが常に呼び出されます。技術的にスーパークラスも初期化されており、独立して使用することができるので、サブクラス化することで防ぐことはできません。あなたのシナリオでは

+0

私は自分のサブクラスとスーパークラスの両方でinitializeを実装しています。 Appleのドキュメントによれば、スーパークラスの初期化は常にサブクラスの前に呼び出されます。とにかくそれを防ぐためにあるのです – JPC

+0

ああ。私はそれをテストし、同じことを見ます。私は私の答えを変えていると思う。 Fooの 'initialize'メソッドは、あなたが防止しなければならないことは何ですか? –

+0

通知をリッスンし、そのサブクラスのやり方とは異なるやり方で通知に作用するオブジェクトをalloc-initsします。私は初期化を実装せず、代わりにセットアップメソッドを呼び出すだけで解決しました。 – JPC

7

(関与サブクラスがある場合)あなたはinitializeメソッドが送られるクラスを確認する必要があり:

+ (void) initialize 
{ 
    if (self == [MyClass class]) 
    { 
     // Do something here only once 
    } 
} 
関連する問題