我解决了大多数内存泄漏问题,但是这一步非常困难。发生以下情况。我需要在表视图中从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 keep]函数所致。但是如果没有此功能,数组将无法加载,并且我得到一个EXC_BAD_ACCESS。如果释放sortedArray,由于sortedArray已消失且无法调用,因此我还会得到EXC_BAD_ACCESS。

有人知道如何解决这个问题吗?谢谢!

最佳答案

您的诊断是对的。如果您第二次为操作分配一个sortedArray值,则前一个对象会泄漏。

解决方案是在执行分配之前调用release:

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

一个更优雅的解决方案是将sortedArray声明为keep属性:
   @property (nonatomic, retain) NSArray* sortedArray;

这样您就可以将上述三行替换为:
    self.sortedArray = [containerArray sortedArrayUsingDescriptors:[NSMutableArray arrayWithObject:sortDescriptor]];

这样就可以正确地处理释放和保留。

10-08 07:45