インターフェースの実装で定義された静的変数をよく理解していません。メソッドでは、ローカル変数との違いを理解していますが、実装で直接定義されている場合は違います。
これらの例を見てください。これら2つは実際にどのような違いがありますか?
#include "MyClass.h"
@implementation MyClass
int myInt;
...
@end
そして:
#include "MyClass.h"
@implementation MyClass
static int myInt;
...
@end
myInt
は両方の場合ですべてのメソッドに表示され、テストを解釈して正しく実行した場合、myInt
は両方の場合でクラスの異なるインスタンスに対して同じ変数になります。
そのコンテキストの「静的」キーワードは、プレーンCの場合と同じです。myIntのスコープを現在のファイルに制限します。
残念ながら、使用する場所によって効果は異なります。
静的関数:
デフォルトでは、すべての関数にグローバルスコープがあります。静的指定子を使用すると、関数のスコープを現在のファイルに制限できます。
静的ローカル変数:
ローカル変数で静的修飾子を使用すると、関数は呼び出し全体でその値を「記憶」します。たとえば、次のスニペットの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キーワードの使用は、ローカル変数のスコープに影響しません。
静的キーワード の詳細をご覧ください。
「CとObjective-Cの両方で、静的変数はプログラムのライフタイム全体に割り当てられる変数です。これは、1つの関数呼び出し中にライフタイムが存在する自動変数とは対照的です。より簡単に言えば、静的変数の値は、すべての関数/メソッド呼び出しを通して維持されます。関数の外部で宣言されると、静的変数は、それが存在するファイル内のすべてに表示されます宣言済み。関数またはメソッド内で宣言された場合、その関数またはメソッド内でのみ表示されますが、値は呼び出し間で保持されます。」
ここで完全な説明をチェックしてください:
Appleの「Objective-Cプログラミング言語」から:「変数の宣言staticは、スコープをクラスだけに限定し、ファイルに実装されているクラスの一部のみに限定します。変数、静的変数をサブクラスに継承したり、サブクラスから直接操作したりすることはできません。」