0

私はAppleのサイトでこれを検索しましたが、どちらも使用していないストーリーボードまたはナビゲーションコントローラーを使用したドキュメントしか見つからないようです。これは、メモリ管理についての非常に簡単な質問です。

完全に空白のアプリケーションを作成しました。AppDelegateのdidFinishLaunchingWithOptions関数で、作成したViewControllerのインスタンスを作成しています。私の設計(それ自体が問題になる可能性があります)は、View ControllerとViewsの間に1:1の関係を持たせることです。

したがって、すべての起動パッドである私のアプリケーションのメインメニューはMenuViewController.h/mにあります。

.hで:

MenuViewController *m;

.mで:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    m = (MenuViewController *)[[MenuViewController alloc] init];
    m.window = self.window;
    [m doStuff]; // handful of functions, not actually called this
    //[m release]; // doesn't make sense to me
    return YES;
}

これは私が混乱しているところです。これは、基本的にアプリケーションのライフサイクル全体にわたって存在する必要があります。しかし、私はまた、(現在の関数の範囲内で)割り当てたものをすべて解放する必要があるという印象を受けています。それを超えて必要な場合は、最初に他の場所に保持する必要があります。これは本当ではありませんか?

私の基本的な質問は...このViewControllerをどこでリリースする必要があるかです。私が言ったことで、他に何かがうまくいかないように思われることはありますか?

4

2 に答える 2

2

初期化が間違っています。ウィンドウをコントローラーに割り当てるのではなく、コントローラーをウィンドウに割り当てます。

    // window creation code here
    ...
    m = [[MenuViewController alloc] init];
    [window setRootViewController:m]; // window does retain for m
    [m release]; // so we release it here
    [self.window makeKeyAndVisible];
    return YES
}
于 2012-05-22T20:23:26.437 に答える
0

あなたが正しい。通常、スコープ内で作成したものはすべてリリースする必要があります。ただし、この場合、ViewControllerの所有権が必要です。この場合dealloc、アプリデリゲートのメソッドでオブジェクトを解放する必要があります。

- (void)dealloc {
    [m release];
    [super dealloc];
}

propertyまたは、保持フラグを使用してView Controllerに@を定義し、次のようにすることもできます。

MenuViewController *viewController = [[MenuViewController alloc] init];
self.m = viewController;
[viewController release];

ところで、どちらの場合もMenuViewControllerにキャストする必要はありません。

編集:私はあなたがあなたのウィンドウにあなたのViewControllerを追加しないことを完全に逃しました。良い点@Eimantas。

于 2012-05-22T20:23:29.697 に答える