4

我有一个带有 7 个视图控制器的 UITabBarController 的 iPad 应用程序。

这是在我的 applicationDidFinishLaunching 中:

// 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;
}

在任何时候,我都希望用户能够完全重新加载这些视图控制器,因此所做的任何更改、正在进行的任何动画、任何子视图等都会从内存中刷新,并且视图控制器都会重新加载。

我发现最简单的方法是在 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;
    }
}

我用新创建的集合替换了视图控制器数组。你也可以看到我尝试过的其他一些事情。

我不明白为什么每次执行重置时,仪器中的分配都会增加(并保持不变)并且应用程序开始变慢。我重置的越多,它就越慢,直到它变得无法使用。

我正在使用 ARC,我希望每次刷新选项卡栏控制器中的视图控制器时它都能处理内存管理。然而,无论我怎么做,每次刷新都会消耗更多的内存。

是什么让一切都变慢了?

4

0 回答 0