2011-10-04 98 views
0

我有一個viewcontroller,進入這個我添加了幾個子視圖到他的視圖,添加數組(數組 - 父視圖控制器的屬性),並沒有發佈子視圖現在添加,但釋放他們dealloc。我對有關內存泄漏的消息感到尷尬。我如何找到解決內存管理問題的方法?謝謝!內存泄漏警告

-(void)someMethod 
{ 
    for(<<something in something>>) 
    { 
      ValidationColumnViewController *controller = [[ValidationColumnViewController alloc] initWithFrame:CGRectMake(columnsInitialX, 5, validationColumnWidth, validationColumnHeight) andValidationColumn:column withMaxCellsCount:maxCellsCountForValidationColumns];    
      [gameFieldView addSubview:controller.view]; 
      [validationColumnViewControllers addObject:controller]; 
    } 
} 
-(void)dealloc 
{ 
    for(ValidationColumnViewController *controller in validationColumnViewControllers) 
    { 
     [controller release]; 
    } 
} 

回答

1

你一定要與線

ValidationColumnViewController *controller = [[ValidationColumnViewController alloc] initWithFrame:CGRectMake(columnsInitialX, 5, validationColumnWidth, validationColumnHeight) andValidationColumn:column withMaxCellsCount:maxCellsCountForValidationColumns]; 

釋放您所創建的對象將它們添加到陣列剛過(的ADDOBJECT:調用增加1對象的保留計數),而不是在的dealloc。如果你不這樣做,他們可能會在dealloc之前被其他調用從數組中刪除,在這種情況下,你會泄漏內存。我認爲你也應該在dealloc方法中釋放validationColumnViewControllers,因爲它顯然是一個保留的ivar。

另外添加controller.view對象到另一個視圖:

[gameFieldView addSubview:controller.view]; 

是不是一個好主意,這增加了由controller.view 1保留計數而不是控制器保留計數。這意味着控制器可以被釋放,但不會導致問題(視圖試圖與其控制器交談時的EXEC_BAD_ACCESS)。

而且在

-(void)dealloc 

你應該總是調用[超級的dealloc]在函數的結束,這是究竟是什麼導致對象被釋放。

+0

so bad :(NSDictionary是什麼而不是NSArray? – Arsynth

+0

使用數組沒有問題(向字典中添加對象也會增加它的保留數量)只要確保您釋放的東西多次保留即可可以打印retainCount(這是一個NSObject屬性)來檢查(但是,一旦對象被釋放,這個值是沒有意義的,所以不要使用它,除非它意味着> 0)。 – jbat100

+0

如果你認爲'[gameFieldView addSubview:controller。 view];'是一個問題,那麼在ValidationColumnViewController中dealloc做'[self。查看removeFromSuperview];'。但我認爲這可能不是問題。我的猜測是,當上面的代碼所在的類被釋放時,gameFieldView將會被釋放,並且直到那時ValidationColumnViewControllers纔會被保留。 – morningstar

4

在addObject調用後立即釋放每個對象。不需要等待dealloc。

+0

我不行。因爲它是一些對象的委託(作爲賦值屬性) – Arsynth

+0

@ user578205收聽格雷厄姆。您創建ValidationColumnViewController的每個實例,其保留計數爲1.當您將其添加到validationColumnViewControllers時,您會保留該實例,從而導致保留計數爲2.您需要在將實例添加到數組以將其保留計數返回後釋放該實例它仍然保留;它不會去任何地方。當你擁有的對象被釋放時,你的dealloc方法最後會釋放它們(儘管我建議釋放包含它們的數組而不是循環遍歷並單獨釋放它們)。 – trudyscousin

0

我認爲你的代碼實際上可以正常工作,但其他答案中的建議是更好的編碼實踐和風格。你沒有得到引用計數你的方式的優勢。

編譯器無法弄清楚你的代碼保證了數組中的對象將被釋放。它會尋找簡單的模式,例如在創建或保留實例變量並在dealloc中釋放它們的範圍內釋放。如果找不到它們,它會給出警告,但這並不一定意味着你在錯誤地管理內存,只是編譯器無法驗證你是否正確地做了這件事。儘管在編譯器識別的模式之外做某些事情應該很少是必要的。