私はdealloc
あなたがすることを学びまし[object release];
たが、viewDidUnload
(UIViewControllerサブクラスでは)あなたはself.object = nil
. (オブジェクトがプロパティself.object = nil
であると想定しています) が(何もしない) 保持してから古い値を解放し、参照カウントが 0 になるため、実際の違いは何ですか?(nonatomic, retain)
nil
4 に答える
self.object = nil
セッターを呼び出し、古い値を解放し、メンバーを に設定しnil
、おそらく他のことを行います (これはメソッドなので、何でもできます)。その「何か」の部分は潜在的に危険です。たとえば、この質問を参照してください。
[object release]
古い値を解放しますが、メンバーをぶら下がっているポインターとして残します。これは、バグの良いレシピです。ポインタ自体も消えようとしているので、実際には問題ではdealloc
ありませんが、それ以外の場合は、に設定せずにメンバーを解放するのは非常に悪い考えnil
です。
(補足として、オブジェクトを解放すると参照カウントが 0 になると想定しないでください。参照は解放されますが、他のオブジェクトはまだそれを参照している可能性があります。)
object = nil
なしで行う[object release]
と、メモリ リークが発生する可能性があります。@Jimが提案したように、後でそれを行わ[object release]
ないと、オブジェクトはダングリングポインターになります。セッター関数呼び出しのシュガーです。object = nil
self.object = nil
オブジェクトをリリースすると、解放されたオブジェクトになります。
解放されたオブジェクトに対して何らかの操作を実行しようとすると、アプリがクラッシュします。このような事故を避けるために、「オブジェクトを解放した後、オブジェクトを nil に割り当てる」ことが常に推奨されます。nil に対して実行された操作は実行されないことは誰もが知っているからです:)
[オブジェクトのリリース] を実行し、オブジェクトにアクセスしたい場合、アプリは単純にクラッシュします。object = nil を実行し、オブジェクトにアクセスしたい場合、何も実行されません。
理由は「オブジェクト解放」で、オブジェクトを解放しようとしています。そのため、ポインターはありません(メモリはありません)。object = nil,
オブジェクトにnullポインターを割り当てようとしています。したがって、オブジェクトにアクセスしようとしても何も起こりません。
object release]; object = nil;
オブジェクトに予期せずアクセスしてもアプリがクラッシュしないため、通常は [ のようにコードを記述します。