7

私はObjective-Cでこれに似たコードを持っています:

SubclassOfNSObject *GlobalVariableThatShouldNeverChange;

@implementation MyClass

+(void) initialize
{
    [super initialize];
    GlobalVariableThatShouldNeverChange = [[SubclassOfNSObject alloc] init];
    // Change more stuff with GlobalVariableThatShouldNeverChange
}

@end

これはコード全体で参照されていますが、これへのポインタは、コード全体でどこでも使用しているため、変更されることはありません。問題は、 を使用してテストを実行するGHUnitと、 のポインターが変更されるという奇妙な問題が発生するGlobalVariableThatShouldNeverChangeことです (つまり、再初期化されます。自動解放プールを介して変数が解放されるという問題があり、それは修正されました。この問題の回避策がありますが、その理由を知りたいですか?

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

4

3 に答える 3

16

ドキュメントは言う:

ランタイムは、クラス、またはそれを継承する任意のクラスの直前に、プログラム内の各クラスに initialize を 1 回だけ送信します。

推奨されるアプローチは次のとおりです。

+ (void)initialize
{
    if (self == [GHUnit class]) {

        /* put initialization code here */

    }
}

ドキュメントの次の推奨事項にも注意してください。

… 通常、実装では送信initializeしないでください。super

于 2010-10-11T21:55:57.667 に答える
6

簡単な答えは「はい」+initializeです。複数回呼び出すことができます。

Bill Bumgarnerは、これについて彼のブログに良い記事を書きました。+ initializeを複数回実行できる(+ loadはそれほど多くない)を参照してください。

于 2010-10-11T21:56:48.450 に答える
2

dreamlax の回答をまとめると、サブクラスを明示的に作成せずにサブクラスを作成する可能性があることに注意してください。つまり、KVO を使用している場合、サブクラスがオンザフライで作成され (次に、初期化が再度呼び出されます)、すべてのインスタンスがまさにこのクラスに変更されています。

于 2012-01-18T16:14:40.763 に答える