iPhone设计模式&内存管理问题

时间:2011-07-08 06:23:29

标签: objective-c uiviewcontroller uinavigationcontroller retaincount

在我的iPad应用程序中,我有一个UINavigationController和多个viewControllers充当选项卡。我没有使用UITabbarController因为我想要某些自定义查找选项卡,所以一直在加载不同的控制器,这些控制器是单个UITableViewController的子类,它封装了整个tableview和单元格逻辑,点击图标按钮作为选项卡。屏幕的底部。

看看我实现的设计我真的不需要一个navigationController,因为我不需要推送/弹出视图[我现在正在做的]并希望一次只有一个viewController。

我现在所做的是:

  1. 在我的appDelegate中的didFinishLaunchingWithOptions方法中,我将导航控制器分配为:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    UINavigationController *navigationVC = [[UINavigationController alloc]init];
    navigationVC.navigationBarHidden = YES;
    navigationVC.navigationBar.barStyle = UIBarStyleBlack;
    self.navigationController = navigationVC;
    [window addSubview: [self.navigationController view]];
    [navigationVC release];
    
    //set orientation as portrait
    self.currentOrientationType = PORTRAIT;
    
    //start with launch screen view controller
    [self setViewController:LAUNCH param:nil];
    
         return YES;
    }
    
  2. 在我的方法setViewController:param:中,根据传递给它的ID,它正在加载相应的viewController,如下所示:

    - (void)setViewController:(NSString *)ID param:(NSString *)param {
    
    UIViewController *viewController;
    
         if(ID == HOME) {
            viewController = [[HomeScreenViewController alloc]initWithNibName:@"HomeScreenViewController" bundle:nil];
         }
    
        else if(ID == ...){
        }
    
        ...
    
       //push the specified view controller
    [self setTransitionType:nil];
    
    [[self navigationController] initWithRootViewController:viewController];
    [viewController release];
      }
    }
    

    正在发生的是我的任何viewControllers,因为rootViewControllers没有被取消分配。似乎每次为每个新的viewController启动navigationController都是错误的,因为它保留了对其根视图控制器的引用,并且我一次又一次地初始化它而不关心它保留在早期viewController上的引用计数。

    什么是更好的方法,因为我想在任何时间点只有一个viewController?

1 个答案:

答案 0 :(得分:1)

根据Apple文档,initWithRootViewController创建了一个新的导航控制器实例。每次调用setViewController方法时,都在创建一个新的导航控制器实例。相反,您需要使用initWithRootViewController创建一个,然后使用PushViewController方法为您想要成为活动视图的视图。