2011-01-04 9 views
0

ここに私のコードです、私は1つのビューから別のメモリリークなしで取得しようとしています。私がしなければならないすべては[second release]を削除しているiphoneの別のビューへのナビゲーション

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    firstviewcontroller *first = [[firstviewcontroller alloc] init]; 
    [window addSubview:first.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

-(IBAction)gotosecondview:(id)sender 
{ 
    secondviewcontroller *second = [[secondviewcontroller alloc] init]; 
    [self.view addSubview:second.view]; 
    [second release]; 
} 

-(IBAction)gotofirstview:(id)sender 
{ 
    [self.view removeFromSuperview]; 
} 

クラッシュすることなく、上記のコードを動作させるために、。 削除するとメモリエラーが発生します(ビルドと分析)。どうすればこの問題を解決できますか?私は使用したくない[self.navigationController pushViewController:second animated:YES]; すべて私はナビゲーションコントローラを使用せずに、あるビューから別のビューへナビゲートしたり、その逆の操作をしようとしています。私のfirstviewcontrollerとsecondviewcontrollerはタイプUIViewControllerです。

ありがとうございます。

答えて

1

ビューが表示されている間(現在のユーザー入力などを処理できるように)、現在のビューコントローラーをアクティブに保つ必要があります。あなたのコードで

、あなたはいくつかの方法でそれを達成することができます

  • はインスタンス変数としてfirstviewcontrollersecondviewcontrollerのインスタンスを保持し、かつdealloc方法でそれらを解放。
  • インスタンス変数を現在使用しているUIViewControllerのままにして、別のビューに切り替えるとその変数を解放します。

番目のオプションのためのコードは次のようになります。また、からの切り替えのためのロジックを処理switchToViewController方法、単一UIViewController生き嘘を維持するためにここで

@interface 
    UIViewController *currentViewController; 
@end 

@implementation 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { 

    firstviewcontroller *first = [[[firstviewcontroller alloc] init] autorelease]; 
    [self switchToViewController:first]; 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

- (void)switchToViewController:(UIViewController *)aViewController { 
    [currentViewController.view removeFromSuperview]; 
    [currentViewController release]; 

    currentViewController = [aViewController retain]; 
    [self.window addSubview:currentViewController.view]; 
} 

-(IBAction)gotosecondview:(id)sender { 
    [self switchToViewController:[[[secondviewcontroller alloc] init] autorelease]]; 
} 

@end 

、すべてのロジックをある視点から別の視点へ。追加ボーナスとして、switchToViewControllerに2行追加することで、アニメーションのサポートをすばやく追加することができます。

+0

その華麗な説明PGBに感謝。コードの素敵な部分がここにあります。 – Rajashekar

+0

それがあなたを助けてくれてうれしいです。 – pgb

+0

私は1つの質問に対して複数の回答を受け入れることができますか? – Rajashekar

0

通話中にビューを解放することはできません。 このような条件でできることは1つだけです。

0

理由[second release]は、あなたが順番に2番目のビューを解放し、あなたのビューコントローラをリリースしているので、あなたのコードをクラッシュする可能性が高いです。 iPhoneの料理本には、あなたが達成しようとしていることがあれば、ビューの切り替え/入れ替えに関するサンプルコードがあります。ここにリンクがあります。お役に立てれば!

link text

+0

大変ありがとうございました...このリンクには多くの情報があります。私はそれらのすべてをダウンロードしたiPhoneとiPadのためのプログラミングながら、これは便利で非常に多くなります。ありがとう、トンバディ。 – Rajashekar

関連する問題