33

静的変数とは何かについて議論している投稿をいくつか見たことがありますが、理解できたと思いますが、通常の変数と静的変数の両方を並べて使用するプログラムをすばやく作成 (または検索) したいと思います。どのように/いつ動作するかが異なります。2 つの int vars と 2 つの NSLog 追跡ステートメントで、それらがどのように異なるかを確認するためのいくつかのクイック n ダーティ コード。

静的変数が通常の変数とどのように異なるかを示すヒント/アイデア/コードはありますか?

4

3 に答える 3

135

CとObjective-Cの両方で、静的変数はプログラムの存続期間全体に割り当てられる変数です。これは、自動変数とは対照的です。自動変数の有効期間は、単一の関数呼び出し中に存在します。オブジェクトのような動的に割り当てられた変数。使用されなくなったときにメモリから解放できます。より簡単に言えば、静的変数の値は、すべての関数/メソッド呼び出しを通じて維持されます。関数の外部で宣言された場合、静的変数は、それが宣言されたファイル内のすべてに表示されます。関数またはメソッド内で宣言された場合、その関数またはメソッド内でのみ表示されますが、値は呼び出し間で保持されます。

あなたがこれを持っているとしましょう:

int f(void)
{
    int i = 5;
    i += 10;
    return i;
}

を呼び出すたびにf()、値が返されます15

今、あなたがこれを持っていると言います:

int g(void)
{
    static int i = 5;
    i += 10;
    return i;
}

初めてg()呼び出されると、値15が返されます。2回目は、の値を維持し、それ自体を.だけインクリメントして25、返されます。3番目の呼び出しが返されます。等々。i151035

Objective-Cにはクラス変数がないため、Objective-Cクラスのコンテキストでは、静的変数を使用してクラス変数を模倣することがよくあります(Javaなどの他の言語にはあります)。たとえば、オブジェクトを遅延初期化し、そのオブジェクトのみを返したいとします。あなたはこれを見るかもしれません:

static MyObject *obj = nil;

@implementation MyObject

+ (id)sharedObject
{
    if (obj == nil) obj = [[MyObject alloc] init];
    return obj;
}

@end

objclassObjectが最初に呼び出されたときに初期化されます。の後続の呼び出しはclassObject同じオブジェクトを返します。オブジェクトのアドレスをログに記録することで、これを確認できます。

NSLog(@"obj is at %p", [MyObject sharedObject]);
NSLog(@"obj is at %p", [MyObject sharedObject]);    // Will print the same address both times

さらに、objのすべてのメソッドに表示されMyObjectます。

この手法は、Objective-Cでシングルトンクラスを実装するためにも使用されます。

于 2011-02-11T02:46:26.237 に答える
2

staticは主にCのように機能します。

  1. 変数を初期化できるのは1回だけです。

  2. ブロックの上のファイルで変数staticを宣言すると、ファイル@implementation全体でのみ使用できます。

于 2011-02-11T02:47:03.960 に答える
1

「静的」は、値だけでなく、変数の属性 (誰がどこで何をするか) を指します。値のみを参照する他の言語とは異なります。

  • スティッキー

これは、変数を関数内または実装内の特定の場所に固定するようなものです。

  • プライベート

兄弟や親には見えませんが、子供はアクセスできるという点で、「プライベート」var と同様の属性があります。

  • 上品

デフォルト値での宣言です。クラス内で変数を定義し、それらの「デフォルト」値を割り当てる他の言語と同様に:

private int myNumber = 3;

これにより、関数内で「クラスのような」変数が得られます。それらを一度宣言すると、関数が値を操作するときに値が保持されます。次に関数が呼び出されると、操作後にクラス変数の値が残ることを期待するのと同じように、値は前の「循環」後の値と同じになります。

于 2013-12-11T17:22:23.720 に答える