2009-07-15 27 views
3

addSubviewを使用して別のビューにUIViewを追加すると、UIViewがスーパービューから自動的に解放されても、それはわかりません。 1つのビューに1つのスーパービューしか持たないことは分かっていますが、サブビューを1つのスーパービューから別のスーパービューに移動する方法については明確ではありません。ビューを新しいスーパービューに移動すると、古いスーパービューから自動的に解放されますか?

は(旧スーパーから)ビュー、リリース、新しいスーパーへの新しいスーパー

または

単にaddSubviewaddSubviewを保持しますか?

答えて

4

-removeFromSuperViewが呼び出されたときにビューが解放されるかどうかは、-removeFromSuperViewのUIViewリファレンスに記載されています。 -addSubView:-removeFromSuperViewを呼び出すことは明示されていませんが、それは暗示されており、UIViewサブクラスで-removeFromSuperViewをオーバーロードすることによってテストできます。

したがって、この場合は-removeFromSuperViewと呼ぶ理由は考えられません。メモリ管理の理由はありません。そのため、コードの複雑さ(したがって潜在的なエラー)がほとんどありません。後で開発者にこのビューがビュー階層を変更していることを強調したい場合でも、ここで追加の保持/解放ではなくコメントを使用します。

+1

"...それは暗黙のうちに..."どこ?私は ' - [UIView addSubview:]'のドキュメントでそれを見つけることができませんでした。 –

+3

iPhone App Programming Guideのビュー階層(「サブビューの追加と削除」)は、コレクションのようにメモリ管理され、ビューが1つの階層にしか存在しないことを示します。したがって、別のものに入れられる前に削除されないようにCocoaを削除するか、(NSArrayにnilを挿入した場合など)失敗した場合にCocoaが例外をスローします。さらに、 "willRemoveSubview:"は、親ビューにサブビューを追加するときに呼び出されるメソッドの中にリストされます。 –

2

スーパービューにビューを追加すると、そのビューが保持され、スーパービューからビューを削除するとビューが解放されます。

[[theView retain] autorelease]; 
[theView removeFromSuperview]; 
[newSuperview addSubview:theView]; 

スーパーその後、サブビュー意志、サブビューに保持持っている唯一のオブジェクトである場合:

[subview retain]; // because next line will release 
[subview removeFromSuperView]; // released by superview 
[otherSupView addSubview:subview]; // retained by new superview 
[subview release]; // because you retained it in line 1 
+0

OK、保持、削除、解放せずに新しいスーパービューにビューを再割り当て(追加)すればどうなるでしょうか? – Meltemi

+0

おそらく何もありません。両方のスーパービューが同時に見える場合は、奇妙なものかもしれません。 – EightyEight

2

安全のために、あなたはそのようにそれを移動する前に、ビューに保持して置きますスーパービューから削除されたときに割り当て解除されます。 retainとautoreleaseは、(ビュー上に余分な保持があるため)関数でビューを使用している間は、ビューの割り当てが解除されないことを保証します。

関連する問題