0

私のアプリケーションはビューベースで開始しましたが、後でナビゲーション ベースに変更する必要がありました。私がこれを行った方法は、私の中で UINavigationController メンバーを作成し、メソッドAppDelegateを呼び出すことでした:pushViewControllerdidFinishLaunchingWithOptions

@property (nonatomic, retain) IBOutlet UINavigationController *navigator;

// didFinishLaunchingWithOptions implementation
MainController *mainView = [[MainController alloc] initWithNibName:@"MainController" bundle:nil];
navigator = [[UINavigationController alloc]init];
[navigator pushViewController:newSongView animated:YES];
[mainView release];

MainController viewには、このメソッドを呼び出してユーザーを次のビューに送るボタンがあります。

- (IBAction)newViewLoader:(id)sender {
    SecondViewController *secVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self.navigationController pushViewController:secVC animated:YES];
}

これは正常に動作しますが、このボタンが押された瞬間、シミュレーターは 5MB の追加メモリを使用し始めます。そしてback、ナビゲーションバーのボタンを押してから、newViewLoaderメソッドを呼び出すボタンを押すと、シミュレーターによってさらに 5MB が使用されます。など、2 番目のビューが読み込まれるたびに。したがって、このビューをロードするのは非常にコストがかかります。

ビューが開かれるたびにメモリが増加し続けないように、戻るボタンが押されたときにビューをアンロードする方法はありませんか? ビューが読み込まれるたびに何が起こるかを示すスクリーンショットを次に示します。

4

1 に答える 1

2

ARC を使用していない場合は、IBAction で少なくとも 1 つのメモリ リークが発生しています。そのはず:

- (IBAction)newViewLoader:(id)sender {
    SecondViewController *secVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self.navigationController pushViewController:secVC animated:YES];
    [secVC release];
}

または私が好むもの:

- (IBAction)newViewLoader:(id)sender {
    SecondViewController *secVC = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
    [self.navigationController pushViewController:secVC animated:YES];
}

そうしないと、secVC が解放されません。リリースを追加してみて、何が起こるかを確認してください。

ただし、実際には、自動参照カウントである ARC を使用する必要があります。これにより、リリースが処理されます。ここでそれを読んでください:http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2012-08-31T18:07:54.217 に答える