2011-06-11 10 views

答えて

36

は、このコードを参照してください。

このような変数は実際にはアプリケーションと同じ長さですが、私たちが話している変数はポインタのみです。 Objective-Cでは、オブジェクトは常に動的に割り当てられているので、常に型のポインタを使ってオブジェクトのアドレスを指定しますが、オブジェクトの基になるデータは動的に割り当てられた野生の青いyonderにまだ存在します。

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

+4

ジョナサンは正しいです!引き渡された引数が自動解放プールにあり、メソッドが呼び出された直後に自動解放される場合はどうなりますか? - >静的ポインタにアクセスするとエラーが発生します(主にEXEC_BAD_ACCESS) –

+0

Martin、小規模な修正:EXC_BAD_ACCESS(例外としてEXC)です。 – bneely

+0

明確な説明をありがとう – Stavash

16

ジョナサンGrynspanの受け入れ答えの簡易版:

retainは、オブジェクトを指す変数のためではありません。その変数になります。 retainは、変数が指すオブジェクト用です。 retainがなければ、オブジェクトは割り当てを解除することができます。次に、sigabrtを引き起こすものを指す変数があります。この変数がどこにも指し示されていないことは、「ダングリングポインタ」として知られています。 ARCの文脈では、行うための最善のことは、強いとして静的変数を宣言

をあるので、このような何か:

static ThatClass * __strong thatStaticVariable; 

これはthatStaticVariableポイントが有効なオブジェクト(すなわちになるためのことを、そのオブジェクトを確保しますいったん割り当てられると、割り当て解除されることはありません)。それがデフォルト(そうsayeth the docs、おかげで@zpasternackする)、これだけ

static ThatClass *thatStaticVariable; 

を使用すると、あなたは良いしているだからはしかし、あなたが実際には、まったく__strongキーワードは必要ありません。

注:アプリケーションが動作している間は、いつも=

+5

ARCの下で、明示的な所有権修飾子のない保持可能なオブジェクトは暗黙的に__strongなので、sayeth [the docs](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference)です。 – zpasternack

関連する問題