インターフェイスの実装における静的変数の意味は何ですか?
-
23-08-2019 - |
質問
インターフェイスの実装で定義される静的変数についてはよくわかりません。メソッドでは、ローカル変数との違いは理解していますが、実装で直接定義されている場合はわかりません。
これらの例を見てください。これら 2 つは実際にはどのような違いを生むのでしょうか?
#include "MyClass.h"
@implementation MyClass
int myInt;
...
@end
そして:
#include "MyClass.h"
@implementation MyClass
static int myInt;
...
@end
myInt
どちらの場合も、すべてのメソッドに表示され、実行したテストが正しく解釈された場合、 myInt
どちらの場合も、クラスの異なるインスタンスの同じ変数になります。
解決
という文脈における「静的」キーワードは、普通Cであろうものと同じである:それは、現在のファイルにミンの範囲を制限する
。他のヒント
残念ながら、使用する場所によって効果が異なります。
静的関数:
デフォルトでは、すべての関数にグローバル スコープがあります。静的指定子を使用すると、関数のスコープを現在のファイルに制限できます。
静的ローカル変数:
ローカル変数に対して 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 キーワードの使用は、ローカル変数のスコープには影響しません。
詳細については、こちらをご覧ください。 静的キーワード.
"これは生涯1つの関数呼び出しの間に存在する自動変数とは対照的である;および動的に割り当てられました使用していました。もっと簡単に言えば、もはや、静的変数の値は、すべての関数/メソッドを通じて維持されていない場合、メモリから解放することができ、オブジェクト、のような変数は、関数の外で宣言すると、静的変数は、ファイル内のすべてに表示されます。呼び出しますそれが宣言され、関数またはメソッドの内部で宣言された場合には、それだけで、その関数またはメソッド内で可視であるが、値は呼び出しの間に保持されている "
。ここでは完全な説明を確認します:
Appleの「Objective-Cのプログラミング言語の」From:「変数の宣言の静的のはただのクラスにその範囲を限定 - と、ファイルに実装されていますクラスのほんの一部に(従って、インスタンス変数とは異なり、静的変数はによって継承することができない、あるいは、直接的に)サブクラスによって操作。 "