【问题标题】:Memory leak when refreshing table view with retain iOS使用保留 iOS 刷新表视图时内存泄漏
【发布时间】:2011-06-08 15:22:59
【问题描述】:

我自己解决了大部分内存泄漏问题,但这一个在 imo 中相当困难。发生以下情况。我需要在表格视图中从 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 已经消失并且无法调用。

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

【问题讨论】:

    标签: iphone objective-c ios memory-leaks retain


    【解决方案1】:

    您的诊断是正确的。如果您以您的方式再次为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 前面
    【解决方案2】:
    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 比您早了几分钟。但还是谢谢您!
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2011-06-26
    • 2011-12-24
    相关资源
    最近更新 更多