我解决了大多数内存泄漏问题,但是这一步非常困难。发生以下情况。我需要在表视图中从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]];
这样就可以正确地处理释放和保留。