1

私はMultiViewアプリを持っていて、メモリに関する懸念があります。アドバイスをいただければ幸いです。ユーザーがいくつかのビューを切り替えることができるスイッチコントローラーを最初にロードするアプリケーションがあります。アプリケーションのある時点で、switchviewコントローラーを削除し、ウィンドウに別のサブビューを追加したいのですが、共有アプリケーションのデリゲートにアクセスし、switchviewコントローラーを削除して、2番目のコントローラーを挿入しました。わかりません。これが正しいアプローチであり、2番目のコントローラーのretainCount値を出力すると、19が表示されるため、メモリリークが発生するのではないかと心配しています。

以下は私のコードのスナップショットです。これは正しいアプローチですか?これらのメモリリークを回避するにはどうすればよいですか?

ApplicationDelegateには、プロパティとして設定した2つのViewControllerがあります。

MyAppDelegate.h

@class SwitchViewController;
@class SecondController;

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

    SwitchViewController *switchViewController;
    SecondController *secondController;  
}


@property (nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@property (nonatomic, retain) IBOutlet SecondController *secondController;

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

追加する.mファイルに

[self.window addSubview:switchViewController.view];
[self.window makeKeyAndVisible];

これらのコントローラーを合成し、dealloc関数で解放していることに注意してください

これが私の問題です!SwitchViewController.mで、アプリのデリゲートにアクセスしたいのですが、現在のSwitchViewControllerを削除し、ウィンドウのサブビューとしてsecondControllerを配置します。

 SwitchViewController.m

 SecondController *secondController2= [[SecondController alloc] init];

 MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

 [appDelegate.switchViewController.view removeFromSuperview];

  appDelegate.secondController = secondController2;

  [appDelegate.window addSubview:appDelegate.secondController.view];

  [secondController2 release]; 

ここに質問があります。[appDelegate.secondControllerretainCounter]を出力すると19になります。これは正しいアプローチですか。実際にメモリリークが発生していますか?

前もって感謝します、

アンドレアス

4

1 に答える 1

1

あなたのアプローチは健全に見えますが、それをただ目で見るよりもテストするためのより良い方法があります。Macに付属のInstrumentsツールを使用して、リークがあるかどうかをテストします。

また、補足として、トランジションを行うためのより良い方法があります

[UIView transitionFromView:appDelegate.switchViewController.view 
                    toView:appDelegate.secondController.view
                  duration:1.0 
                   options:UIViewAnimationOptionTransitionNone 
                completion:nil];

お役に立てれば。

于 2011-09-09T13:29:19.080 に答える