我仍然在学习Objective C和iPhone开发的基础。我的弱点是内存管理 - 我们非常感谢任何帮助。
在下面的代码中,我可以在哪里发布NSMutableArray listOfViewControllers
?请记住,可以在应用程序中多次调用函数createTab
,并根据用户输入动态重新创建选项卡。此函数位于ViewController中。
如果我在退出该功能之前执行[listofViewControllers release]
,则当我必须再次调用createTabs时应用程序崩溃
如果我使用下面的便利方法:
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];
}
答案 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