2009-03-19 9 views
7

Objective-Cでクラス変数を宣言すると、いつメモリが解放されますか?objective-cクラス変数:deallocはいつ呼び出されますか?

私のインタフェースがある場合:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

と実装では、私は宣言:

static NSString instanceCount; 

どのように私は、このクラスレベルの変数を解放するのですか? Objective-Cでクラス変数を呼び出すときにdeallocが呼び出されるのはいつですか?

+3

Obj-Cを学んでいる間、ちょうどこの質問に遭遇しました。 Appleは "クラス変数"は存在しないことを示唆しているようで、インターフェイスで定義したものは静的変数とは別のクラス*メソッド*であり、実装で定義する必要があります。静的変数は、クラスそのものではなく、実装*ファイル*のスコープに制限されています。たぶん、これはちょっとしたことですが、ちょっと混乱しました。 http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

答えて

10

あなたの質問に対する簡単な答えは、「プログラムが終了したとき」です。

静的変数は、main()関数が開始する前に、プログラムの冒頭に割り当てられます。同様に、彼らはあなたのプログラムの最後に、main()の直後にリリースされます。このメモリ管理はObjective-Cランタイムによって処理され、すべてが舞台裏で行われます。

この動作を監視しようとしている場合、おそらくあまり運がないでしょう。カスタムクラスで、次の、その後、別のクラスの静的メンバーとしてそのクラスを使用しなかった場合、例えば:

- (void)dealloc 
{ 
    NSLog(@"I am being deallocated"); 
    [super dealloc]; 
} 

をあなたは、このメッセージがログに表示されないだろう。これにはいくつかの理由があります。 1つは、NSLog()が必要とする変数は、通常のシャットダウン手順の一部として既に割り当て解除されている可能性があります。ランタイムシステムでは、deallocメソッドを呼び出すことなく、1回のショットで残りのメモリをすべて解放するだけなので、2つです。

カスタムクラスがdeallocメソッドで何か重要なことを行っている場合、これは問題になる可能性があります。このような場合は、プログラムが終了する直前にこれらのオブジェクトを呼び出すカスタムcleanupメソッドを記述することを検討してください。

+0

deallocがインスタンスメソッドであり、クラス – cobbal

+0

のために0または100回呼び出されるという事実は言えませんが、はい、私はこのメソッドをオブジェクトとして使用していました別のクラスの静的メンバー。私は(うまくいけば)私の答えでそれをクリアしました。それを指摘していただきありがとうございます! –

関連する問題