静的変数は、解放してもプログラムの実行中は存在するので、保持する必要はありませんか?
このコードを参照してください: https://github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29
静的変数は、解放してもプログラムの実行中は存在するので、保持する必要はありませんか?
このコードを参照してください: https://github.com/magicalpanda/MagicalRecord/blob/master/Source/Categories/NSManagedObjectContext+MagicalRecord.m#L24-29
私はあなたがのような静的オブジェクトポインタを意味すると仮定していますstatic NSString *foobar;
。
そのような変数は確かにアプリケーションと同じくらいの寿命がありますが、私たちが話している変数はポインターのみです。Objective-Cでは、オブジェクトは常に動的に割り当てられるため、オブジェクトのタイプへのポインターを使用して常にアドレス指定しますが、オブジェクトの基になるデータは、動的に割り当てられたワイルドブルーの向こうにまだ存在します。
オブジェクトへのポインタがスコープから外れることはありませんが、オブジェクト自体は他のオブジェクトと同じように割り当てを解除できるため、ポインタはゴミ、またはさらに悪いことに、別の無関係なオブジェクトを指すことになりますので、オブジェクトを保持する必要があります。 。
Jonathan Grynspan の受け入れられた回答の簡略版:
オブジェクトを指す変数用ではretain
ありません。その変数は静的であるため、永久に存続します。は、変数が指すオブジェクト用です。オブジェクトがなければ、割り当てを解除できます (また、そうすべきです)。次に、を引き起こすものを指す変数を取得しました。このどこも指していない変数は、「ダングリング ポインター」と呼ばれます。retain
retain
sigabrt
ARC コンテキストの場合、静的変数を strong として宣言するのが最善の方法です。つまり、次のようになります。
static ThatClass * __strong thatStaticVariable;
これにより、thatStaticVariable
ポイント先のオブジェクトが割り当てられると有効なオブジェクトになります (つまり、割り当てが解除されることはありません)。ただし、実際には __strong キーワードはまったく必要ありません。これはデフォルトであるためです (@zpasternackのおかげでdocsに記載されています) 。
static ThatClass *thatStaticVariable;
そして、あなたは良いです。
注: 永遠に = アプリケーションが実行されている間