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