2011-11-08 21 views
-1

私は、変数の保持と解放について少し混乱しています。誰かが教えてくれるものを教えてくれますか?

これらは、私の質問です:私はAが
Object *A = [[Object alloc] init]

を割り当てられたオブジェクトを持って

  1. この増加は、カウントを保持していますか?
    Object *A = [[[Object alloc] init] retain]と同じですか?
    私がretainを呼び出すと、オブジェクトは解放されるまで保持されます。

  2.  
    2.1。 私はObject Aを保持しています。このObject Aは引数として関数に渡されました。その後、私はそれをリリースしました。 Object Aのメモリを解放しますか?存在する場合は、Object Aは存在しなくなります。

    2.2 Object Aをリリースするのではなく、2.1を実行してください。私はローカル変数Object *B = Aを作成しました。私がObject Bをリリースした場合は、Object Aもリリースされます。または、私がBを保持していれば、Aも保持されますか?

私はちょっと混乱しています。私はここに誰かに私に正しい道を向けるように頼みたいと思います。 alloc(又はnew)を呼び出す

おかげ

答えて

2

オブジェクト* A = [[Object alloc] init]これにより保持カウントが増加しますか?

はい、より具体的には、おそらく、それは1

に保持カウントを初期化し、それは、オブジェクト*のA =有する同じです[[[オブジェクトALLOC]をINIT]保持します]。私たちが保持を呼び出すと、オブジェクトは解放するまで保持されます。

同じではありません。保持回数が2回増加します。同じ場所で保持回数を2回増やす理由はあまりありません。あなたがそれをした場合、あなたはリリースを2度呼び出す責任があります。

私は保持されたオブジェクトAを持っています。このオブジェクトAは、引数として関数に渡されました。その後、私はそれをリリースしました。オブジェクトAのメモリを解放するのか?そうであれば、オブジェクトAはもはや存在しない。

最初に、リリースがメモリを解放するかどうかは、オブジェクトへの参照を保持する他の所有者がいるかどうかによって決まります。複数のものがオブジェクトを保持している場合、解放はその場合にメモリを解放しません。

第2に、悪い考えです。参照カウントで正気を保つためには、特定のパターンに従うべきです。

  1. インスタンス変数を保持(または割り当て)し、それらをdeallocまたはそれ以前に解放します。
  2. 必要に応じてローカル変数を保持(または割り当て)し、メソッドを終了する前に解放します。
  3. 呼び出し元が関数の戻り値を所有していません。これは、ローカル変数のように関数の戻り値を処理するが、解放する代わりに返す前に自動解放することを意味します。これにより、必要に応じて、発信者がそれを保持するのに十分な長さであることが保証されます。パターンの

一つは、メソッドの引数への参照を所有するメソッドの呼び出し元に対するないが、関数が返すとき、呼び出し側は参照を所有していません。このメソッドは、呼び出し元の参照を解放すべきではありません。

オブジェクトAを解放するのではなく、2.1を実行します。私はローカル変数Object * B = ObjectAを作成しました。私がBをリリースした場合、オブジェクトAもリリースされます。あるいは、Bを保持していれば、Aも保持しますか?

保持および解放は、参照ではなくオブジェクトに送信されます。 AとBは同じオブジェクトを参照しているため、他のものと同じ呼出し保持または解放があります。

[B retain]以降は、同じメソッド[B release]で正当ですが、おそらく不要です。しかし、[B release]だけを実行しないでください。これにより、Aのオブジェクトの所有権が奪取されます。

+0

関数にローカル変数があり、その関数が実行された場合、ローカル変数は破棄されるか、メモリに残ります。 – LittleFunny

+0

変数は消え去りますが、ポインタの場合はポインタが自動的に消えません。 – morningstar

2

は、保持カウントを増加させます。それ以降もretainが表示された場合は、それが再び増加します。特定の希望の場合を除いて、2回目の保持を行う必要はありません。

主なルールは、allocreleaseのものです。もちろん、あなたが何をやっているかを知っているなら、それを回避することができます。

私は保持されたオブジェクトAを持っています。このオブジェクトAは、引数に という関数に渡されました。その後、私はそれをリリースしました。オブジェクトAのメモリが になりますか?

基本的にはい。

もしあれば、オブジェクトAはもはや存在しません。

また、場合によっては「メモリ内」のままであるため、呼び出しを非常に短時間で行うことができます。とても短い。

オブジェクトAを解放するのではなく、2.1を実行します。ローカル 変数オブジェクト* B = ObjectAを作成しました。私がBをリリースした場合は、 オブジェクトAもリリースします。または、Bを保持していれば、Aも保持しますか?

Bを保持すると、Aによるオブジェクト参照は2回保持されます。したがって、Bを解放すると、Aによって参照されるオブジェクトは解放されません。ただし、Bを保持しない場合は、Bを解放することはAを解放することになります(1つの保持カウントのみ)。

ヒント

あなたは(バルーン*ロープ)を宣言任意の参照は、あなたが物事が含まれているバルーンオブジェクトを保持するために手に入るロープであることを想像してみてください。ロープは対象ではありません。オブジェクト(バルーン)は、メモリ(ここではスペース)のどこかに作成されます。 2回目を保持すると、そのバルーンに別のロープが手に入り、もう一方の手に渡します。バルーンを解放するには、両方のロープを解放する必要があります。

alloc(またはnew)はロープを作成するので、あなたが作成したバルーンはouterspaceですぐには移動しないことに注意してください。

これは明確ですか?

+2

'-init'は保持カウントを増加させません。一方、 '+ alloc'は、そうします。 –

+0

@Bavarious:訂正ありがとう、私は素早く書いていました:-) – Oliver

2

これを覚えておいてください:NARC。

新規、Alloc、Retain、Cop​​yは、保持カウントを増加させる4つのコマンドです。つまり、NARCごとに、そのメモリを解放するには対応するリリースが必要です。

1

1)initはretainと同じではありません。

initメソッドは実際にオブジェクトを正しい "初期化"状態にして、親クラスのinitメソッドを呼び出すことによってオブジェクトを使用できるようにします。また、実装されているinitメソッドに配置されている追加の設定を設定します。オブジェクト.mファイル。 retainは実際には保持カウントを1だけインクリメントします。

2)2.1)オブジェクトにメモリを割り当てるとき、それを同じスコープで解放したいので、オブジェクトをメソッドに渡すとそこにそれをリリースしないだろう。しかし、オブジェクト参照を渡してから渡された関数/メソッドで解放した場合は解放されます。オブジェクト自体が存在しなくなっても完全にはわかりません。

2.2)Object *B = ObjectAと言うときは、実際には別のオブジェクトを作成していませんが、ObjectAへの新しい参照またはポインタを作成しています。参照Bでrelease/retainを呼び出すと、ObjectAと同じオブジェクトを指しているので、ObjectAでrelease/retainを呼び出すのと同じことです。

関連する問題