72

インターフェイスの実装で定義されている静的変数がよくわかりません。メソッドでは、それらがローカル変数とどのように異なるかを理解していますが、実装で直接定義されている場合はわかりません。

これらの例を見てください。これら2つは実際にはどのような違いがありますか?

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

と:

#include "MyClass.h"

@implementation MyClass
static int myInt;
...
@end

myIntどちらの場合もすべてのメソッドに表示され、正しく実行したテストを解釈したmyInt場合、両方の場合でクラスの異なるインスタンスに対して同じ変数になります。

4

4 に答える 4

93

残念ながら、使用する場所によって効果が異なります。

静的関数:
デフォルトでは、すべての関数にグローバル スコープがあります。static 指定子を使用すると、関数のスコープを現在のファイルに制限できます。

静的ローカル変数: ローカル変数
で static 修飾子を使用すると、関数は呼び出し間でその値を「記憶」します。たとえば、次のスニペットの currentCount 変数はリセットされないため、main() 内の変数にカウントを格納する代わりに、countByTwo() に記録を任せることができます。

// main.m
#import <Foundation/Foundation.h>

int countByTwo() {
    static int currentCount = 0;
    currentCount += 2;
    return currentCount;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"%d", countByTwo());    // 2
        NSLog(@"%d", countByTwo());    // 4
        NSLog(@"%d", countByTwo());    // 6
    }
    return 0;
}

この static キーワードの使用は、ローカル変数のスコープには影響しません。static キーワード
の詳細を参照してください。

于 2013-11-05T11:10:11.313 に答える
72

そのコンテキストでの「static」キーワードは、普通の C での場合と同じです。myInt のスコープを現在のファイルに制限します。

于 2009-07-06T14:57:39.923 に答える
18

Apple の「The Objective-C Programming Language」から: 「変数を静的に宣言すると、そのスコープがクラスだけに制限され、ファイルに実装されているクラスの一部だけに制限されます。(したがって、インスタンス変数とは異なり、静的変数は継承できません。サブクラスによって、または直接操作されます)。」

于 2013-02-21T16:32:00.280 に答える