使用保留iOS刷新表视图时内存泄漏

时间:2011-06-08 15:23:00

标签: iphone objective-c ios memory-leaks retain

我解决了大部分记忆漏洞,但这一点非常难以实现。发生以下情况。我需要在表视图中从facebook加载信息,这个表视图有一个刷新功能。此tablview中的所有行都是从数组加载的,此数组由数据对象组成,因为它们需要进行排序。我的代码看起来像这样(我已经删除了不相关的部分)。

此部分贯穿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!

2 个答案:

答案 0 :(得分: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]];      

这将正确处理释放和保留。

答案 1 :(得分: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]];