0

プロジェクトには現在、すべてのアプリケーションのメイン ビューとして機能する「ダッシュボード」と呼ばれる UIviewController があります。このメイン ビューは、分割ビューのような 2 つのサブビューで構成されています。メインの左側 (左図) には複数のボタンがあります。右側(ライトビュー)には、左側の選択したボタンの内容が表示されます。

ボタンが押されると、次のように表示されるビューの新しいインスタンスが作成されます。

vcMySchedule_iPad *vcSchedule = [[vcMySchedule_iPad alloc] initWithNibName:@"vcMySchedule_iPad" bundle:nil];
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcSchedule];

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque;

ncDashboard.view.frame = self.vwRightPanel.bounds;

[self.vwRightPanel addSubview:ncDashboard.view];

別のボタンを押すと別のビューが表示されますが、以前に呼び出されたビューのメモリは残っており、以前のビューの割り当て解除は呼び出されません。

左側にはボタンがあり、押すと左側が左側に移動し、右側が左側に移動して完全に表示されるため、分割ビューを使用していません。

これに対するアプローチはありますか?

一部の画像を更新しました...

メイン (MainViewController): ここに画像の説明を入力

プレスコースカタログ:

vcCourseCatalog_iPad *vcCourse = [[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil];
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse];

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque;

ncDashboard.view.frame = self.vwRightPanel.bounds;

[self.vwRightPanel addSubview:ncDashboard.view];

ここに画像の説明を入力

テーブルから行を選択すると詳細が表示され、ユーザーがボタンを押すとビューが最大表示されます。

ここに画像の説明を入力

おそらく私は新しい見解を間違って呼んでいたのではないかと思います。オブジェクトはどこにリリースされますか?

4

2 に答える 2

0

CrimsonDiego の回答に加えて、ファイルで次の行を使用することをお勧めします。

.hファイル内:

@property (nonatomic, retain) UIView *ncDashBoard;

.mファイル内:

@synthesize ncDashBoard = _ncDashBoard;

それ以降のみ使用_ncDashBoardしてください。これは、保持カウントが適切に設定されていることを確認するためです。

于 2012-06-11T19:32:52.970 に答える
0

これ以上の情報がなければ、確かなアドバイスはできませんが、次のことを確認してください。

  1. ARCを使用していますか?そうでない場合は、何かを解放する前に、すべての参照を明示的に解放する必要があることに注意してください。
  2. サブビューへの参照を他の場所で保持していますか? どこか (特に ARC) でまだ参照している場合は、残ります。ここでは循環参照は悪です。
  3. 新しいサブビューに置き換える前に、スーパービューからサブビューを削除していますか? これほど単純なことの頻度に驚かれることでしょう。

編集:

あなたがARCを使用していないことについて、以下に答えて、1)があなたの問題であることは明らかです。あなたは参照を解放していません。この場合、次のことは明らかです。

vcCourseCatalog_iPad *vcCourse = [[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil]; ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse];

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque;

ncDashboard.view.frame = self.vwRightPanel.bounds;

[self.vwRightPanel addSubview:ncDashboard.view];

vcCourseCatalog_iPadaと aUINavigationControllerを解放せずに割り当てていること。最適には、vcCourseCatalog_iPad を自動解放し、スワップ アウトするときにナビゲーション コントローラーを解放します。

コードは次のようになります。

vcCourseCatalog_iPad *vcCourse = [[[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil] autorelease];

if(ncDashboard)
{
    //do any sort of removal from views here
    //[ncDashboard.view removeFromSuperview];
    [ncDashboard release];
}
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse];
ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque;
ncDashboard.view.frame = self.vwRightPanel.bounds;

[self.vwRightPanel addSubview:ncDashboard.view];
于 2012-06-11T16:04:27.320 に答える