gpt4 book ai didi

iphone - 使用保留 iOS 刷新 TableView 时内存泄漏

转载 作者:行者123 更新时间:2023-12-01 18:02:51 24 4
gpt4 key购买 nike

我自己解决了大部分内存泄漏问题,但这一个在 imo 中非常困难。发生以下情况。我需要在表格 View 中从 facebook 加载信息,此表格 View 具有刷新功能。此 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 已经消失并且无法调用。

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

最佳答案

你的诊断是对的。如果给 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]];      

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

关于iphone - 使用保留 iOS 刷新 TableView 时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6281260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com