2011-12-20 9 views
0
UIButton *btn = [[UIButton alloc]init]; 

にメモリを解放する、私はBTN解放する必要があります。は、上記のコードでは、IOS

第2のタイプでは、btnをリリースする必要がありますか、またはリリース自体を呼び出す必要はありません。

2番目のタイプでbtnをリリースするにはどうすればよいですか?

答えて

2

オブジェクトがオートリリースされているかどうかを考えないでください。実際には、便利メソッドから返された多くのオブジェクトはオートレリースされていません。例えば、静的インスタンスである可能性があります。

代わりに、のオブジェクトかどうかを考えてください。名前—または明示的にこれらはあなた自身の返されたオブジェクト、そしてあなたがreleaseとあなたの所有権を放棄しなければならないということを意味するものでretain —での所有権を取得したオブジェクトのためにallocnew、またはcopyを持つメソッドの場合。あなたが所有していないオブジェクトの場合は、releaseは必要ありません。

メモリ管理のrulesは、非常にです。記憶に残すと、このような質問に対する答えは第二の性質になります。

+0

ありがとうございますdreamlax – raghul

+1

なぜdownvote? – dreamlax

0

2番目の型では、自動解放オブジェクトを返すので、解放することを心配する必要はありません。

1

2番目の例でボタンを放す必要はありません。 [UIButton buttonWithType:]は、自動解放されたオブジェクトを返します。

単純なルールがあります:あなたはreleaseに必要な場合にのみ、あなたallocretaincopyまたはmutableCopy

+0

Appleは、オブジェクトがオートレリースされているかどうかについては、オブジェクトを所有しているかどうかだけ考えるのは有益ではないと述べています。私が自分の答えで述べたように、多くの便利なメソッドはオートレリースされたオブジェクトを返さないが、あなたが所有していないオブジェクトです。 – dreamlax

+0

[このPDF](http://www.apple.com.cn/developer/iphone/library/documentation/UserExperience/Conceptual/MemoryMgmt/MemoryMgmt.pdf)の14ページの上部を参照してください。 – dreamlax

0

最初のケース:

あなたはそれを所有しているので、それを解放する必要があります。あなたがオブジェクトを作成すると

  • (新規またはのalloc、コピーまたはmutablecopy)、それは 1の保持カウントを持って、あなたはそれを所有しています。
  • メッセージを保持するオブジェクトを送信すると、保持カウントは に1ずつ増えています。

第二ケース:あなたが受け取る

ボタンは、コンビニエンスコンストラクタから取得されます。

"コンプリートコンストラクタ"は、自動解放メッセージが送信されるオブジェクトを作成します。

したがって、2番目のケースでボタンを放すべきではありません。 retainメソッドを送信した場合にのみ、リリースメッセージを送信できます。

+0

この質問に必ずしも真実ではなく、関連性のない多くの実装の詳細について議論しています。新しい自動解放プールが手動で作成された場合(タイトループでメモリを管理する目的で)、自動解放プールが現在のイベントループの終了前より早く消耗する可能性があります。オブジェクトがリリースされるときは気にしないでください。オブジェクトを所有しているかどうかについては、代わりに考える必要があります。 – dreamlax

0

ボタンを離す必要はありません。自動的に自動解除型を返します。そして、あなたが所有しているとき(allocやnewやcopyのように)オブジェクトを解放する必要があるだけです。

関連する問題