使用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]];
这将手都适当释放和保持。
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]];
前面谢谢你的回答,sergio在你前面几分钟..但是,无论如何,谢谢! – Jos 2011-06-08 15:36:20
这实际上马上就起作用了。不知道为什么我没有看到...但是,谢谢你!你的编辑看起来更棒!试过之前,但没有把自己。在sortedArray – Jos 2011-06-08 15:29:59