2012-01-17 12 views
3

が私の現在のプロジェクトのソースコードを読んで、私は以下を参照してください。[自己保持]が有効な場合はありますか?

一つのクラスで
[self retain] 

、そのinit方法で。

私は正確にその理由を理解していません。 Appleからメモリ管理ルールを読み込んでも、これについて何も表示されず、仮想アドレス[self release]も表示されません。

答えて

3

オブジェクトは、初期化時に自身の所有権をアサートしています。これが有用かもしれないことがわかる唯一の理由は、オブジェクトがイベントが発生するまで自身の存在を保証する必要がある場合です。たとえば、タイマーを実行した後、タイマーが切れたときに自身を解放する可能性があります。

文書化されておらず、対応するリリースがない場合はおそらくバグです。

-3

あなたが何らかのオブジェクトを持っていれば、それはヒーリング/ライフを持​​っているようです。あなたがそれを作ったとき、それは1つの生きている。そして。機能を「保持する」彼の人生の数を増やす+1、リリース機能を減らす彼の人生の数を減らす-1、deallocも減少する、allocを増やす

+1

これは間違いなくOPが尋ねたものではありません。問題は、通常の「保持」の代わりに '[自己保持]'がどのように機能するかです。 – Skyler

1

私が正しくリコールすると、成熟前の解放を避けるために自己保持を使う。私はそれがベストプラクティスではないと言いますが、ゲームのルール(この場合はObj-C)を知っていれば、時にはそれらを壊すことができます。

+0

あなたは 'show'を呼び出すとUIKitに警告を渡してしまいます。そして、あなたはもうそれを望んでいないので、' release'します。 UIKitのシーンの背後にあるのは間違いありません(例えば、ビュー階層に追加されてスーパービューが最初にそれを保持するようになります)。 – mattjgalloway

+0

右...アプリウィンドウはおそらくリテーナーです。 –

1

これはおそらくエラーであると思われますが、通常は自分自身を保持することが目的ではありません。

私はあなたのライフサイクルをより注意深くしなければならない委任と通知という特殊なケースが1つしかありませんが、この場合でもオブジェクト自体でリリース/保持を行うべきではありません。エリックへ

注:ビューがあったが、ビューhiercarchyで、その後、参照しているので、それが破壊される前に

UIAlertの場合は、あなたがそれを解放することができます。したがってビューはビュー階層から削除されると自動的に破棄されます

+0

はい...私はすでに言及しました。 –

+0

いつ破壊されますか?おそらく、代理人に返信した後、ユーザーがボタンを押した直後ではないでしょうか? – Ricardo

1

selfを保持するのは間違いありません。しかし、それをinitの方法で見ると疑わしいと聞こえます。私はそれが良いことになる良い例を考えることができません。しかし、ARCでは、これを行うことさえできないので、より良いやり方を考える必要があります。一般に、オブジェクトが生存している必要がある場合、オブジェクトを保持している別のオブジェクトが存在します。自己保持オブジェクトは、決して解放されないエラーの傾向があります。

2

最高の推測では、コードを書く人には保持エラーがあり、これは実際の問題を「迅速に解決する」ものでした。

関連する問題