スーパービューからビューを削除するにはremoveFromSuperview
を使用しています。私はまたremoveFromSuperview
の後にrelease
を使用しています、時にはうまく動作することがありますが、時には悪いアクセスを与えます。はremoveFromSuperviewオブジェクトを解放しますか?
はremoveFromSuperview
また、オブジェクトにrelease
を呼び出しますか?
スーパービューからビューを削除するにはremoveFromSuperview
を使用しています。私はまたremoveFromSuperview
の後にrelease
を使用しています、時にはうまく動作することがありますが、時には悪いアクセスを与えます。はremoveFromSuperviewオブジェクトを解放しますか?
はremoveFromSuperview
また、オブジェクトにrelease
を呼び出しますか?
はい、removeFromSuperview
も表示されます。
スーパービューに追加した後でビューを解放する必要があります。
CGRect frame; // let's assume you already have defined frame and superview
UIView *superview;
UIView *subview = [[UIView alloc] initWithFrame:frame];
[superview addSubview:subview];
[subview release];
それとも、あなたがビューを作成するときに、autorelease
を使用しています。どちらの場合も
UIView *subview = [[[UIView alloc] initWithFrame:frame] autorelease];
[superview addSubview:subview];
、あなたがremoveFromSuperview
を呼び出した後release
を呼び出す必要はありません。
はい、addSubviewの呼び出しはretain、removeFromSuperviewの呼び出しはreleaseを呼び出します。したがって、あなたの呼び出しはそこに属しません(おそらく、あなたがオブジェクトを保持したくないと仮定して、サブビューを割り当てた後に属します)。
実際にはremoveFromSuperview
は、ビューオブジェクトのretainCount
プロパティを減らします(release
)。
だから、もしあなたがAleksejsのやり方をすれば。
UIView *subview = [[UIView alloc] initWithFrame:frame];
[superview addSubview:subview];
[subview release];
subview
- >alloc
= retainCount
= +1、
subview
- >addSubView
= retainCount = +1
subview
- >release
= retainCount
= -1。
subview
- >removeFromSuperView
= retainCount = -1
(サブビューをメモリから削除)
正解は "おそらく" です。これは実際には考えてはいけない実装の詳細です。あなたのコードがサブビューで作業する必要がある場合は、作業を開始する前にそれを保持しておく必要があります。作業を終えたらリリースする必要があります(スーパービューから取り除くことと一致する場合もあればそうでない場合もあります) )。
このテストでは、removeFromSuperviewがビューを解放していることをテストで確認できますが、この動作に依存することはできません。たとえそれがいつも起こっても、将来はそうではないかもしれません。
このような低レベルでのメモリ管理について考える必要はありません。 retain
またはcopy
またはalloc
またはnew
のオブジェクトを保持している場合は、今後、ある時点で反動する責任を負うものとします(release
)。
これらのことをしていない場合は、リリースしないでください。ビューにサブビューを追加する方法には、名前にretain
またはcopy
が含まれていないため、ではありません。はスーパービューから削除するときに自分で解放するはずです。
ビューシステムは非常に複雑です。特に、限られた量のRAMを搭載したiPhoneでは、仮想メモリを使用するにはストレージが不十分です。ルールに固執して、あなたは大丈夫でしょう。 ARCを有効にする。
絶対保持カウントは無用です(-retainCountはゼロを返すことはできません)。デルタの点で考える。 – bbum
なぜ役に立たないのかの詳細は、https://developer.apple.com/documentation/objectivec/1418956-nsobject/1571952-retaincount?language=objcを参照してください。 –