1

どこに問題があるのか​​わかりませんが、このコードはクラッシュしています。オブジェクトを解放しすぎていませんか?

settings = [[SettingsViewController alloc] initWithNibName:@"SettingsController" bundle:nil];
settings.hidesBottomBarWhenPushed = YES;

NSArray * arrayWithRootController = [[NSArray alloc] initWithObjects:settings, nil];
[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController];
[arrayWithRootController release];
[settings release];

行を削除すると

[settings release];

アプリはクラッシュしません。しかし、私はそれが正しいと確信しています。問題は別の場所にありますか?

何か案は?どうもありがとう

4

1 に答える 1

1

このスニペットではリリースしすぎていませんが、明らかに何かが正しくありません。ルートビューコントローラをアレイに追加すると、ルートビューコントローラが保持されますが、アレイの存続期間中のみです。配列が停止すると、その中のすべてのオブジェクトも解放されます(ここで何が起こっているかについての私の推測)。

試してみることがいくつかあります。まず、自分がいると思う場所にアレイを配置していることを確認します。

[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController];

あなたは何を期待[self.tabBar.viewControllers lastObject]していますか?これが新しいアレイを割り当てたい場所です。レシーバーが無効な場合、配列は次の行に保持されません。つまり、ViewControllerも解放されます。

私はあなたのアーキテクチャに精通していませんが、ViewControllerの配列をViewControllerに割り当てているようです。self.tabBarはナビゲーションコントローラーであり、呼び出すことができますsetViewControllers。しかしself.tabBar.viewControllers lastObject...おそらくそれはビューコントローラーですが、必ずしもナビゲーションコントローラーではなく、setViewControllersに応答しない可能性があります(この場合、nilでない限り、クラッシュするはずです。これはおそらくそうかもしれません)。

最後に、InstrumentsツールのZombiesを使用して、意図しないリリースがどこから来ているのかを特定できるかどうかを確認してください。

于 2013-02-20T16:44:23.717 に答える