web-dev-qa-db-ja.com

Objective-Cの静的変数-それらは何をしますか?

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

誰かが静的変数が通常のものとどのように異なるかを示すヒント/アイデア/コードを入手しましたか?

31
Sirab33

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

これがあるとしましょう:

_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_が返されます。 iは_25_の値を維持し、次に_15_だけインクリメントするため、2回目は_10_が返されます。 3番目の呼び出し_35_が返されます。等々。

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

_static MyObject *obj = nil;

@implementation MyObject

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

@end
_

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

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

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

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

126
mipadi

staticは主にCと同様に機能します。

  1. 変数を1回だけ初期化できます。

  2. @implementationblockより上のファイルで変数staticを宣言すると、ファイル全体でのみ使用できます。

2
chunkyguy

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

  • スティッキー

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

  • プライベート

兄弟や親には見えませんが、子供はアクセスできます。

  • 上品

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

private int myNumber = 3;

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

1
bob