私はiOSのプログラミングでかなり新しいです。開発中のiPadアプリで問題が発生しています。 splitviewのrootviewのセルがタップされるたびに、splitviewコントローラを使用して、splitviewのdetailviewにサブビューを追加しています。スタックが高すぎてメモリが足りなくなるまでこれは問題ありません。新しいビューがスタックに追加された後、前のサブビューをどのように解放できますか? この問題を解決するにはより良い方法がありますか?サブビューを解放する
おかげ
私はiOSのプログラミングでかなり新しいです。開発中のiPadアプリで問題が発生しています。 splitviewのrootviewのセルがタップされるたびに、splitviewコントローラを使用して、splitviewのdetailviewにサブビューを追加しています。スタックが高すぎてメモリが足りなくなるまでこれは問題ありません。新しいビューがスタックに追加された後、前のサブビューをどのように解放できますか? この問題を解決するにはより良い方法がありますか?サブビューを解放する
おかげ
は、そのスーパーからビューを削除するには:
[view removeFromSuperview];
スーパーは、その時点でのビューを解放します。したがって、スーパービューが所有参照を持つ唯一のアクターであれば、ビューは割り当て解除されます。言い換えれば、これは次のとおりです。
[superview addSubview:view];
スーパービューはビューを保持します。ですから、今、それは限りビューはスーパーに残るように有効です表示するには、ポインタを持っている
view = [[ViewClass alloc] initWithFrame:frame]; // I own view
[superview addSubview:view]; // superview and I both own view
[view release]; // now only superview owns view;
// it'll be deallocated if
// superview ever relinquishes
// ownership
:だからあなたは、多くの場合のようなコードのブロックを参照してください。したがって、その後はremoveFromSuperview
を投稿するのが安全ですが、その後はビューの使用が明示的に危険です。ビューオブジェクトは、alloc/initとremoveFromSuperviewの間にのみ存在します。削除されると割り当て解除されます。通常のココアの参照カウント規則に従って
、次はかなりのドロップイン置換のalloc/initとその後の放出の場合と同じである:あなたが手動で何もしていない場合は
view = [ViewClass viewWithFrame:frame]; // view is an autoreleased object;
// the autorelease pool owns it
[superview addSubview:view]; // superview now owns view also
// the autorelease pool will relinquish ownership automatically, in the future...
振る舞いに影響を与え、通常のrunloopの直後である場合、自動解放プール内のものは、現在の呼び出しスタックの存続期間中は安全です。この場合は、手動のalloc/initの例と同じようにビューを扱います。おそらく、コード行を保存してメモリ管理を暗黙的に変更するだけのことです。