+(void)initialize
メソッドを実装するクラスFoo
があります。私はFoo
のサブクラスであるクラスも持っています。サブクラスをインスタンス化すると、initialize
メソッドもFoo
で呼び出されてしまいます。これをどうやって防ぐのですか?目的関数-cのサブクラス化メソッド
ありがとうございました。
+(void)initialize
メソッドを実装するクラスFoo
があります。私はFoo
のサブクラスであるクラスも持っています。サブクラスをインスタンス化すると、initialize
メソッドもFoo
で呼び出されてしまいます。これをどうやって防ぐのですか?目的関数-cのサブクラス化メソッド
ありがとうございました。
を私は初期化の実装とだけではなく、セットアップメソッドを呼び出していないことによってそれを解決してきました
コスティクの答えは良いですし、またアップルの推奨する方法です。一度しかセットアップメソッドを呼び出すことは、複数のスレッドが存在する場合には驚くほど困難であり、その目的のために初期化が行われます。 – fishinear
Fishinear、bbumはそうでないと言いますが、通常は正しいです(http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/) –
サブクラスにも+ (void)initialize
を実装する必要があります。通常、人々は[super initialize]
と呼んでいますが、そのステップをスキップする必要があります。空の方法はFoo
の呼び出しを防ぎます。
EDITスーパークラスinitialize
メソッドが常に呼び出されます。技術的にスーパークラスも初期化されており、独立して使用することができるので、サブクラス化することで防ぐことはできません。あなたのシナリオでは
私は自分のサブクラスとスーパークラスの両方でinitializeを実装しています。 Appleのドキュメントによれば、スーパークラスの初期化は常にサブクラスの前に呼び出されます。とにかくそれを防ぐためにあるのです – JPC
ああ。私はそれをテストし、同じことを見ます。私は私の答えを変えていると思う。 Fooの 'initialize'メソッドは、あなたが防止しなければならないことは何ですか? –
通知をリッスンし、そのサブクラスのやり方とは異なるやり方で通知に作用するオブジェクトをalloc-initsします。私は初期化を実装せず、代わりにセットアップメソッドを呼び出すだけで解決しました。 – JPC
(関与サブクラスがある場合)あなたはinitialize
メソッドが送られるクラスを確認する必要があり:
+ (void) initialize
{
if (self == [MyClass class])
{
// Do something here only once
}
}
サブクラスの 'init'メソッドで' self = [super init] 'をしないと思っていますか? – petert
彼はクラス 'initialize'について話していると思いますが、もし本当に' init'を参照しているのであれば、それは正しいです。 –
+(void)initialize – JPC