2010-09-15 88 views
2

我想更好地理解何時在相當內存密集的程序中正確釋放對象。我現在懷疑源於下面的代碼位:何時正確釋放對象

- (void)scrollViewDidScroll:(UIScrollView *)localScrollView 
{ 
    InteractionPointModel *model = [[InteractionPointModel alloc] init]; 

    for (int x=0; x<totalInteractionPoints; x++) { 

     model = [interactionPointData objectAtIndex:x]; 
     CGPoint oldCenter = model->worldLocation; 
     CGPoint newCenter; 
     newCenter.x = oldCenter.x * [localScrollView zoomScale]; 
     newCenter.y = oldCenter.y * [localScrollView zoomScale]; 
     [[interactionPoints objectAtIndex:x] setCenter:newCenter]; 
    } 
    [model release]; 
} 

我本來以爲該方案是由現用模型做的,但它崩潰後釋放。如果我沒有釋放它,程序會運行,但顯然會發生內存泄漏。我究竟做錯了什麼?

+0

我開始覺得問題出現在interactionPointData中,因爲這個方法並不擁有它。既然我用模型指出它,釋放模型會造成嚴重的上游嗎? – diatrevolo 2010-09-15 04:30:12

回答

4

您的代碼存在的問題是當您第一次進入循環時發生泄漏。

InteractionPointModel *model = [[InteractionPointModel alloc] init]; 

的線的上方被分配的是將不被使用的對象。

model = [interactionPointData objectAtIndex:x]; 

的線的上方,使model指向一個不同的對象,因此,以前的值不再被指出。

[model release]; 

由於您釋放的是您不擁有的值,因此在釋放時發生崩潰。當你發佈時,如果你在循環中輸入,至少一次,model指向數組interactionPointData的最後一個對象。

要修復您的代碼,您只需要刪除錯誤的內存管理。

- (void)scrollViewDidScroll:(UIScrollView *)localScrollView { 
    InteractionPointModel *model = nil; 
    for (int x=0; x<totalInteractionPoints; x++) { 
     model = [interactionPointData objectAtIndex:x]; 
     CGPoint oldCenter = model->worldLocation; 
     CGPoint newCenter; 
     newCenter.x = oldCenter.x * [localScrollView zoomScale]; 
     newCenter.y = oldCenter.y * [localScrollView zoomScale]; 
     [[interactionPoints objectAtIndex:x] setCenter:newCenter]; 
    } 
} 
+0

非常有意義,非常感謝。 – diatrevolo 2010-09-15 04:39:57

2

您似乎正在用interactionPointData陣列中的現有對象替換新分配的InteractionPointModel對象。在該方法結束後,您嘗試釋放,我懷疑是您的評論中提到的自動釋放對象(來自數組),,該數組中的對象不屬於您,這會導致崩潰。

如果您不釋放它,泄漏是由您在開始時初始化的新分配的對象引起的,由於您已將model更改爲指向數組中的對象,因此不再可訪問該對象。

+0

是的,這是我懷疑,進一步檢查。謝謝,這無疑給了我一個找到問題的方法! – diatrevolo 2010-09-15 04:32:06