1

インスタンス変数をdeallocするために使用できると想定している-dealloc()メソッドがあります。インスタンスにない別の変数がありますが、クラスレベルの変数であり、いつどのようにこれをdeallocするのか疑問に思っていますか?インスタンスメソッドdealloc()ではできませんよね?参考のために以下のコード(変数:levelHash):

@interface Level : CCNode 
    { 
        //Instance variables
        PlayBackgroundLayer* playBGLayer;
        PlayTilemapLayer* playTilemapLayer;
        PlayUILayer* playUILayer;
        PlayElementLayer* playElementLayer;
    }
    //Property declarations for instance variables
    @property (nonatomic, retain) PlayBackgroundLayer* playBGLayer;
    @property (nonatomic, retain) PlayTilemapLayer* playTilemapLayer;
    @property (nonatomic, retain) PlayUILayer* playUILayer;
    @property (nonatomic, retain) PlayElementLayer* playElementLayer;

    //Static methods
    +(void) Initialize: (NSString*) levelReference;
    +(void) InitLevel: (NSString*) levelReference;
    +(Level*) GetCurrentLevel;
@end

//static variables
NSMutableDictionary *levelHash;

と私の実装:

+(void) Initialize: (NSString*) levelReference 
{
    levelHash = [[NSMutableDictionary alloc] init];
    [levelHash setObject:NSStringFromClass([LevelOne class]) forKey:@"1"];
    //EG CALL IT [levelHash objectForKey:@"foo"];
    //WHEN DO I CALL THIS??? [levelHash release];
}
4

1 に答える 1

2

プログラムの存続期間中はクラスの割り当てが解除されるわけではないため、その辞書を解放する意味はないようです。アプリが使用するすべてのメモリは、終了時に再利用されます。カスタム初期化メソッドを作成したのと同じように、必要に応じて、辞書を解放するクラスの「破棄」メソッドを作成できます。

(ちなみに、これはクラス変数でも静的変数でもありません。ObjC にはクラス変数がなく、staticキーワードがないため、実際にはグローバルです。これが、リークを心配する必要がない理由です。グローバル変数も存在します。プログラムの全ライフタイム。

また、前述のように、ヘッダー ファイルに入れるべきではありません。このヘッダーをインポートするすべてのファイルはそれを再定義しようとしているため、リンカー エラーが発生します。一度しか定義できません。)

于 2012-06-13T05:42:19.147 に答える