为UITabBarController初始化的数组上的内存管理

时间:2010-11-01 20:09:25

标签: iphone

我仍然在学习Objective C和iPhone开发的基础。我的弱点是内存管理 - 我们非常感谢任何帮助。

在下面的代码中,我可以在哪里发布NSMutableArray listOfViewControllers?请记住,可以在应用程序中多次调用函数createTab,并根据用户输入动态重新创建选项卡。此函数位于ViewController中。

  1. 如果我在退出该功能之前执行[listofViewControllers release],则当我必须再次调用createTabs时应用程序崩溃

  2. 如果我使用下面的便利方法:

  3. NSMutableArray *listOfViewControllers = [NSMutableArray arrayWithCapacity:1]

    而不是:

    NSMutableArray *listOfViewControllers = [[NSMutableArray alloc] init]
    

    再次调用createTabs时它仍会崩溃

    -(void) createTabs
    {
    
     //TODO - memory management - where do you release this?
     NSMutableArray *listOfViewControllers = [[NSMutableArray alloc] init]; 
    
    
     if ([briefingsArray count] > 0)
     {
      //add briefing(s) tab(s)
      for (Briefing *briefing in briefingsArray)
      {
    
       WebViewController *briefingViewController = [[WebViewController alloc] initWithBriefing: briefing];
    
    
       [listOfViewControllers addObject:briefingViewController];
    
       [briefingViewController release];
      }
    
    
    
      [listOfViewControllers addObject:alertViewController];
    
      //add archives tab
      NSString *archiveURL = [NSString stringWithFormat: ARCHIVEURL, DeviceID()];
    
      UIViewController *archiveViewController = [[WebViewController alloc] initWithURL:ARCHIVEURL andTitle:@"Archives" andImage:@"archive_icon.png"];
      [listOfViewControllers addObject:archiveViewController];
    
      [archiveViewController release];
    
    
     }
    
    
     NSArray *oldlistOfViewControllers = [self.tabBarController viewControllers];
     UIViewController *vcOld = [oldlistOfViewControllers objectAtIndex:[oldlistOfViewControllers count] -1];
    
    
     [listOfViewControllers addObject:vcOld];
    
    
     [self.tabBarController setViewControllers:listOfViewControllers
                                      animated:YES];
    
    
    }
    

3 个答案:

答案 0 :(得分:1)

我最好的猜测是它与标签栏控制器无关。当你没有释放数组时,数组中的控制器将永远不会被释放,并且根本没有问题。因此,问题很可能来自WebViewController的重新分配。

答案 1 :(得分:0)

看起来你在这里创建的是什么 - listOfViewControllers - 应该是你在这里创建的任何对象的实例变量。然后你应该在对象的-init方法中分配/ init它,并在dealloc中释放它。

在函数调用结束(或开始之前)之后,为期望存在的任何内容创建实例变量是一种很好的做法(通常是必要的)。

答案 2 :(得分:0)

[self.tabBarController setViewControllers:listOfViewControllers                                   动画:是]; ,您可以释放listOfViewControllers。因为tabBarController将通过复制策略保留此listOfViewControllers。

您可以看到有关 viewControllers 属性的UITabBarController参考。此属性采用复制策略。

@property(nonatomic, copy) NSArray *viewControllers