3

アプリのアプリデリゲートについて何か疑問に思っていました。なぜ私はこのようにリリースできないのですか:

-(BOOL)application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RootViewController *controller = [[RootViewController alloc]
                                      initWithNibName:@"RootViewController"
                                               bundle:[NSBundle mainBundle]];
    [self.window addSubview:controller.view];
    [controller release]; // Here's my question
    [self.window makeKeyAndVisible];
    return YES;
}

-addSubviewメソッドの保持カウントが 1 増加することはほぼ確実でした。では、コントローラーを離すとクラッシュするのはなぜですか? なぜデリゲート以外の別のクラスで機能するのですか?

ありがとう !

4

5 に答える 5

3

他の答えは正しいです。UIVIewController は保持されていません。コントローラーを保持するUIWindows rootViewController (iOS 4.0 以降でのみ利用可能) プロパティを設定することをお勧めします。アプリが iOS 4.0 より前をサポートしている場合は、コントローラーをインスタンス変数に格納する必要があります。

-(BOOL)application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RootViewController *controller = [[RootViewController alloc]
                                      initWithNibName:@"RootViewController"
                                               bundle:[NSBundle mainBundle]];
    //controller will be retained and view will set for you
    window.rootViewController = controller;
    [controller release];
    [self.window makeKeyAndVisible];
    return YES;
}
于 2011-07-21T18:27:11.447 に答える
1

この行

[self.window addSubview:controller.view];

controller.view not の保持カウントを増やしcontrollerます。それが理由です

[controller release];

問題を引き起こします。

これがメイン ウィンドウである場合は、メモリ リークを心配する必要はありません。これはwindow、プログラムの存続期間中ずっとアクティブであり、終了時にすべてのメモリがパージされるためです。

于 2011-07-21T18:17:17.823 に答える
0

addSubViewビューコントローラー内のビューの保持カウントを増やします。これが、コントローラーを離すとアプリがクラッシュする理由です。

いずれにせよ、リリースしないとリークが発生します。解決策は、クラスで ivar を作成し、(ローカル変数の代わりに) ビュー コントローラーを割り当ててから、 で解放することですdealloc

于 2011-07-21T18:14:30.117 に答える
0

ビューをサブビューとして追加すると、コントローラーではなくビューが保持されます。したがって、コントローラーを解放すると、割り当てが解除され、そのビューが取得されますが、そうではありません。その結果、後でビューが既に割り当てが解除されているコントローラーにメッセージを送信しようとし、アプリがクラッシュします。

于 2011-07-21T18:15:44.843 に答える
0

これは、あなたがそのコントローラーの一意の所有者であるためです。そのビューをウィンドウのサブビューとして追加するだけです。ビューはウィンドウのビューによって保持されますが、コントローラーは保持されません。

そのため、割り当てが解除され、それをさらに使用するとアプリがクラッシュします。

于 2011-07-21T18:16:10.570 に答える