2010-11-26 45 views
0

我正在寫一個函數,它只在popOver中顯示一個菜單(由tableView組成)。我有一個對象只有一個分配在同一個函數中的五個分配

這是源代碼:

-(void)pushSearch:(NSString *)option type:(int)optionType 
{ 
    searchNav = [[iNavigation alloc] initWithNibName:@"iNavigation" bundle:nil] ; 
    //This is the UIViewController with the tableView 

    [searchNav setSearchMode:optionType]; 

    searchNav.view.frame =CGRectMake(0,0,300,600); 

    NSLog(@"Retain Count: %d",[searchNav retainCount]); 

//此時保持計數爲1

if ([pop isPopoverVisible]) 
    { 
     [pop dismissPopoverAnimated:YES]; 
     [pop release]; 
    } 

    pop = [[UIPopoverController alloc] initWithContentViewController:searchNav]; 

    NSLog(@"Retain Count: %d",[searchNav retainCount]); 
    //At this point retain count is 2 



    [pop presentPopoverFromRect:btnMenu.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    [pop setPopoverContentSize:CGSizeMake(350,600)]; 

    NSLog(@"Retain Count: %d",[searchNav retainCount]); 
    //At this point retain count is 5!!! 

    [searchNav release]; 

} 

我正在遇到的問題是,所使用的存儲器加載的tableview是從未發佈。我的應用程序在內存中增長和增長,直到崩潰。

爲什麼只要我爲searchNav創建一個分配,在將其分配給popOver後,reatin計數是5?

請幫忙嗎?

回答

4

請勿使用-retainCount。

對象的絕對保留數是毫無意義的。

您應該致電release完全相同的次數導致對象被保留。沒有更少(除非你喜歡泄漏),當然,沒有更多(除非你喜歡崩潰)。

查看Memory Management Guidelines的全部細節。


保留數是5是不相關的,很可能是因爲各種框架的內部實現細節。

該代碼中searchNav的內存管理是正確的;你分配了對象(+1保留),然後你最終釋放它(-1保留)。因此,內存泄漏在別的地方。

嘗試在源代碼中使用「構建和分析」。然後使用Allocations工具查看隨着您的應用程序隨着時間增長而掛起的對象。某處存在過度保留;一個保留你沒有與發佈平衡。

+1

我們是否可以讓`[retaincount]`標籤自動重定向到'[retaincount-is-evil-stopit-stopit-stop]`? – walkytalky 2010-11-27 00:47:34

0

你釋放UIPopoverController嗎?也許這個對象仍然保留着桌面視圖。

相關問題