0

一部は以下の方法でのUITableViewControllerを提示:リークツールを使用してビューを作成するときにメモリリークが悪い - 「リリース」が存在するにもかかわらず?私のコードの

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"Settings" bundle:nil]; 
flipside = [[UINavigationController alloc] initWithRootViewController:controller]; 
controller.delegate = self; 
flipside.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentModalViewController:flipside animated:YES]; 
[flipside release]; 
[controller release]; 

、何のメモリリークは、上ピックアップされていません。しかし、私が上記のコードのように設定メニューを表示すると、毎回ほぼ100 kBのメモリが割り当てられ、決して解放されないように見えます。

最後に2つのリリース文を含めると、メモリ割り当てに影響しないようです。対称的なメモリ割り当てについて誤解されていることがありますか?または何か変なことが起こっていますか?

アイデアは大変ありがとうございます - ありがとう!

+0

どのようにメモリの増加を測定していますか?また、シミュレータまたはデバイスのこの増加を測定していますか? –

+0

シミュレータの使用 - 'allocation'ツールを使用して実行します。 「すべての割り当て」アイテムは、設定メニューを開くたびに大きく上昇し続けます。 –

+0

NSZombieEnabledをYESに設定して実行していますか? –

答えて

1

flipsideが保持されているプロパティの場合、ナビゲーションコントローラがリークしています。問題は、アクセサメソッドをバイパスしていて、flipsideを直接解放していることです。これは単なるコードです。より良い方法は、まだ作成していない場合にだけ新しいものを割り当てる、flipsideのアクセサメソッドを作ることです。遅延読み込みと呼ばれます。これを行うには、ちょうど背面ジャケット@synthesizeを残す(ただし、アクセサメソッドの外からそれを設定しないでください)、あなたのヘッダファイル内にプロパティを変更し、実装にこのメソッドを追加します。

- (UINavigationController *)flipside { 
    if (flipside != nil) { 
     return flipside; 
    } 
    FlipsideViewController *controller = [[[[FlipsideViewController alloc] initWithNibName:@"Settings" bundle:nil]; 
    controller.delegate = self; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 
    [controller release]; 
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    // This implies a retain if your flipside property is set to retain 
    self.flipside = navController; 
    [navController release]; 
} 

ビューコントローラのviewDidUnloadメソッドにself.flipside = nilを入れてください。含まれているコードは(私はそれがpresentSettingsアクションであると仮定しています)。 あなたのpresentSettingアクションは次のようになります:

- (IBAction)presentSettings { 
    // make sure you use the accessor self.flipside instead on accessing the variable directly 
    [self presentModalViewController:self.flipside animated:YES]; 
} 
関連する問題