7 つのビュー コントローラーを備えた UITabBarController を備えた iPad アプリがあります。
これは私のアプリケーションにありますDidFinishLaunching:
// Override point for customization after application launch.
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.delegate = self;
self.tabBarController.viewControllers = [self createViewControllers];
self.window.rootViewController = self.tabBarController;
そして、これも私のappDelegateで:
- (NSArray *)createViewControllers
{
MyView1 *viewController1 = [[MyView1 alloc] initWithNibName:@"MyView1" bundle:nil];
MyView2 *viewController2 = [[MyView2 alloc] initWithNibName:@"MyView2" bundle:nil];
MyView3 *viewController3 = [[MyView3 alloc] initWithNibName:@"MyView3" bundle:nil];
MyView4 *viewController4 = [[MyView4 alloc] initWithNibName:@"MyView4" bundle:nil];
MyView5 *viewController5 = [[MyView5 alloc] initWithNibName:@"MyView5" bundle:nil];
MyView6 *viewController6 = [[MyView6 alloc] initWithNibName:@"MyView6" bundle:nil];
MyView7 *viewController7 = [[MyView7 alloc] initWithNibName:@"MyView7" bundle:nil];
NSArray *views = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, viewController4, viewController5, viewController6, viewController7, nil];
return views;
}
いつでも、ユーザーがこれらのView Controllerを完全にリロードできるようにしたいので、行われた変更、進行中のアニメーション、サブビューなどはメモリからフラッシュされ、View Controllerはすべて新たにロードされます。
これを行う最も簡単な方法は、appDelegate にシェイク ジェスチャを追加することです。シェイク ジェスチャにより、「すべてをリセットしますか?」と尋ねる UIAlertView がポップアップ表示されます。はいの場合、次のようになります。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
self.tabBarController.viewControllers = [self createViewControllers]; // <-- this happens
// some of the other things I've tried
// [self.tabBarController setViewControllers:[self createViewControllers] animated:YES]; // same as above but with animation
// self.tabBarController = [[UITabBarController alloc] init]; // allocations go crazy!
// self.tabBarController.delegate = self;
// self.tabBarController.viewControllers = [self createViewControllers];
// self.window.rootViewController = self.tabBarController;
}
}
ビュー コントローラーの配列を新しく作成したセットに置き換えます。私が試した他のいくつかのことも見ることができます。
私が理解していないのは、リセットが実行されるたびに、Instruments の割り当てが増加し (そして維持され)、アプリの速度が低下し始める理由です。リセットすればするほど遅くなり、使用できなくなります。
私は ARC を使用していますが、タブ バー コントローラーでビュー コントローラーを更新するたびに、ARC がメモリ管理を処理することを期待しています。それでも、どのように行っても、リフレッシュするたびにより多くのメモリが消費されます。
何がすべてを遅くしているのでしょうか?