2011-06-08 44 views
1

我自己解決了大部分內存泄漏問題,但這個問題非常嚴重。發生以下情況。我需要在表格視圖中從Facebook加載信息,此表格視圖具有刷新功能。這個tablview中的所有行都是從一個數組中加載的,這個數組由數據對象組成,因爲它們需要排序。我的代碼看起來像這樣(我已經刪除了不相關的部分)。使用retain iOS刷新表格視圖時發生內存泄露

這部分貫穿來自Facebook的結果,並將其放置在一個數組

- (void)request:(FBRequest*)request didLoad:(id)result 
{ 
    if ([result isKindOfClass:[NSDictionary class]]) { 
     //Setting single result into result dictionary 
     NSArray *resultArray = [result allObjects]; 
     result = [resultArray objectAtIndex:0]; 

     for(int i=0; i<13; i++){ 
      //Set all retrieved data in containerArray 
      Post *newPost = [[[Post alloc] init] autorelease]; 
      newPost.created_time = created_time1; 
      newPost.message = message1; 
      newPost.picture = picture1; 
      newPost.fbSource = fbSource1; 
      [containerArray insertObject:newPost atIndex:i]; 

      //Reload the table in the tableView 
      [self.tableView reloadData]; 
     } 
     NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"created_time" 
                     ascending:NO] autorelease ];  

     sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];  
     [sortedArray retain]; 
    } 
} 

到目前爲止,這個工程並沒有給出內存泄漏。但一旦刷新函數被調用。該功能將再次運行。然後創建內存泄漏,我想可能是由於[sortedArray retain]函數。但是沒有這個函數,數組不會加載,我得到一個EXC_BAD_ACCESS。如果我釋放sortedArray,我也會得到EXC_BAD_ACCESS,因爲sortedArray消失了,不能被調用。

有人知道如何解決這個問題?日Thnx!

回答

4

您的診斷是正確的。如果您第二次按照您的方式爲sortedArray賦值,則先前的對象被泄漏。

該解決方案是在做任務之前調用release

[sortedArray release]; 
    sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];  
    [sortedArray retain]; 

更好的解決方案將被宣佈sortedArray作爲保留屬性:

@property (nonatomic, retain) NSArray* sortedArray; 

,這樣就可以代替上述的三條線通過:

self.sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];  

這將手都適當釋放和保持。

+0

這實際上馬上就起作用了。不知道爲什麼我沒有看到...但是,謝謝你!你的編輯看起來更棒!試過之前,但沒有把自己。在sortedArray – Jos 2011-06-08 15:29:59

1
sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]]; 

此行首次運行,這是行。但第二次運行,你指向一個新的陣列,泄漏前一個。所以有兩種解決方案。

首先,這條線像在此之前釋放它:

[sortedArray release];  
sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]]; 
[sortedArray retain]; 

或者讓sortedArray在類中保留的屬性。

@property (nonatomic, retain) NSArray *sortedArray; 

self.sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]]; 
+0

前面謝謝你的回答,sergio在你前面幾分鐘..但是,無論如何,謝謝! – Jos 2011-06-08 15:36:20