19

静的変数は、解放してもプログラムの実行中は存在するので、保持する必要はありませんか?

このコードを参照してください: https://github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29

4

2 に答える 2

38

私はあなたがのような静的オブジェクトポインタを意味すると仮定していますstatic NSString *foobar;

そのような変数は確かにアプリケーションと同じくらいの寿命がありますが、私たちが話している変数はポインターのみです。Objective-Cでは、オブジェクトは常に動的に割り当てられるため、オブジェクトのタイプへのポインターを使用して常にアドレス指定しますが、オブジェクトの基になるデータは、動的に割り当てられたワイルドブルーの向こうにまだ存在します。

オブジェクトへのポインタがスコープから外れることはありませんが、オブジェクト自体は他のオブジェクトと同じように割り当てを解除できるため、ポインタはゴミ、またはさらに悪いことに、別の無関係なオブジェクトを指すことになりますので、オブジェクトを保持する必要があります。 。

于 2011-06-11T15:28:06.310 に答える
17

Jonathan Grynspan の受け入れられた回答の簡略版:

オブジェクトを指す変数用ではretainありません。その変数静的であるため、永久に存続します。は、変数が指すオブジェクト用です。オブジェクトがなければ、割り当てを解除できます (また、そうすべきです)。次に、を引き起こすものを指す変数を取得しました。このどこも指していない変数は、「ダングリング ポインター」と呼ばれます。retainretainsigabrt

ARC コンテキストの場合、静的変数を strong として宣言するのが最善の方法です。つまり、次のようになります。

static ThatClass * __strong thatStaticVariable;

これにより、thatStaticVariableポイント先のオブジェクトが割り当てられると有効なオブジェクトになります (つまり、割り当てが解除されることはありません)。ただし、実際には __strong キーワードはまったく必要ありません。これはデフォルトであるためです (@zpasternackのおかげでdocsに記載されています) 。

static ThatClass *thatStaticVariable;

そして、あなたは良いです。

注: 永遠に = アプリケーションが実行されている間

于 2011-10-26T04:40:12.133 に答える