我解决了大部分记忆漏洞,但这一点非常难以实现。发生以下情况。我需要在表视图中从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!
答案 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]];