使用retain iOS刷新表格视图时发生内存泄露

问题描述:

我自己解决了大部分内存泄漏问题,但这个问题非常严重。发生以下情况。我需要在表格视图中从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!

您的诊断是正确的。如果您第二次按照您的方式为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

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