2

目前我有一个基于导航的应用程序,显然RootViewController是一个UITableView。但是,我认为有必要创建一个漂浮在UITableView之上的UIToolbar。目前我是这样做的。UIToolbar内存泄漏

然而,使用仪器泄漏工具后,我能够确定,这是几内存泄漏,只有很小的原因,但内存泄漏仍然。然后,我进一步钻了下来,并能够确定导致内存泄漏的确切线条。他们是以下。

UIBarButtonItem *infoButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(account_details)]; 

[toolbar setItems:[NSArray arrayWithObjects:infoButton,nil]]; 

[self.navigationController.view addSubview:toolbar]; 

我在努力弄清楚如何去除这些内存泄漏,从而导致我的应用程序运行更流畅。任何帮助将不胜感激为什么上述线路造成泄漏!

回答

3

每次出现视图时都会创建一个新的工具栏,添加到视图中并且永不释放。这意味着该工具栏和它的酒吧按钮项目将永远持续。您可以通过简单地将工具栏添加到视图后释放工具栏或在创建时向其发送autorelease消息来解决此问题。所以,一个体面的方式来做到这一点。将更换:

toolbar = [[UIToolbar alloc] init]; 

有:

toolbar = [[[UIToolbar alloc] init] autorelease]; 

而且,你这样做的方式,每次你的观点似乎你最终加入另一个工具栏时间导航控制器的视图。所以你几乎可以肯定有相当多的这些对象坐在彼此的顶部(所以你仍然会看到泄漏,直到导航视图终于消失)。你可能想要做的就是保持这个工具栏作为伊娃。当视图消失时,从导航控制器视图中移除工具栏。当它出现时,添加它。在你的viewDidLoad方法中创建工具栏本身,并在viewDidUnload中进行清理,然后在dealloc中释放它。所以你的新类可能看起来像这样(让我们假设你创建了一个名为toolbar的合成属性保留):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIToolbar* toolbar = [[[UIToolbar alloc] init] autorelease]; 
    // set up toolbar 
    [self setToolbar:toolbar]; 
    // other load code 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[[self navigationController] view] addSubview:[self toolbar]]; 
    // other vwa code 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [[self toolbar] removeFromSuperview]; 
} 

- (void)viewDidUnload 
{ 
    [self setToolbar:nil]; 
    [super viewDidUnload]; 
} 

- (void)dealloc 
{ 
    UIToolbar* toolbar = [self toolbar]; 
    [toolbar removeFromSuperview]; // shouldn't ever need this, but be safe 
    [toolbar release]; 
    // other dealloc 
    [super dealloc]; 
}