如何消除其他库引起的内存泄漏?

Posted

技术标签:

【中文标题】如何消除其他库引起的内存泄漏?【英文标题】:How to remove memory leaks caused by other library? 【发布时间】:2012-02-21 07:11:37 【问题描述】:

在我的应用程序中,我正在使用一个库,它直接向我返回 NSMutableArray 中 sql 查询的结果。当我使用仪器时,它会显示存储结果的数组的内存泄漏。所以库的创建者尚未处理数组的初始化释放正确。所以有什么方法可以处理我的代码中由库外部数组引起的内存泄漏?代码如下:

-(void)getRecurringDataFromDatabase

     SafeRelease(_arrTblList);
    _arrTblList=[[NSMutableArray alloc]init] ;

    NSError *error = nil;
    NSString *strQuery = [NSString stringWithFormat:@"select * from wt_transaction as w  where w.subcat_id in (select s.subcat_id from subcategory as s where s.subcat_type = 'expense' and IsRepeat = 1)"];
    NSMutableArray *arrExpense = [NSMutableArray requestWithSynchronousQuery:strQuery withReturnningError:&error] ;

    NSString *strQuery1 = [NSString stringWithFormat:@"select * from wt_transaction as w  where w.subcat_id in (select s.subcat_id from subcategory as s where s.subcat_type = 'income' and IsRepeat = 1)"];
    NSMutableArray *arrIncome = [NSMutableArray requestWithSynchronousQuery:strQuery1 withReturnningError:&error];
    if (error) 
        [AppDelegate showAlert:[error description] withTitle:@"Error!"];
    
    else
        if ([arrExpense count]>0)
        
            [_arrTblList addObject:arrExpense];
        
        if ([arrIncome count]>0) 
        

            [_arrTblList addObject:arrIncome];
        
         _reloadCell = YES;
        [_tblView reloadData];
    

这里显示了 arrIncome 和 arrExpense 的内存泄漏。释放或自动释放这些数组并不能解决内存泄漏。解决这些泄漏的唯一方法是它们是否可以由库的创建者解决?我也得到了if 的内存泄漏

(indexPath.row == 0) 
        OverviewViewController *obj1 = [[OverviewViewController alloc] initWithNibName:@"OverviewView" bundle:nil];
        [self.navigationController pushViewController:obj1 animated:YES];


        [obj1 release];
     this code at line    [self.navigationController pushViewController:obj1 animated:YES];
     .how to resolve this leak?

【问题讨论】:

【参考方案1】:

您是否尝试过多次发布它们?喜欢:

[array release];
[array release];

通常我不会推荐它,但如果库返回它们被不正确地保留,这可以解决问题。尝试查看这些数组的 retainCount 属性,看看它们被保留了多少次。请记住,此属性主要用于调试,并且可能会产生奇怪的结果。

如果您决定使用这种方法,则必须广泛测试稳定性。

【讨论】:

第一次释放它后,我得到保留计数 0,如果我再次尝试释放它,应用程序崩溃 好吧,看来数组毕竟被正确保留了。那么泄漏可能是您的代码错误。 如果是我的代码错误,那么为什么仪器会显示库路径?你发现这段代码有什么问题? 仪器将指向分配对象的位置。首先,我会去掉获取数组的自动释放消息,看看会发生什么。【参考方案2】:

无论您使用什么库,它似乎都设计得很糟糕。具体来说,在 NSMutableArray(或 NSArray)上添加一个类别来执行数据库访问是一种可怕的反模式。

同样,您的代码也有一些严重的问题; get不应该用作前缀,直接检查error判断是否发生错误是错误的等等...

最后,leaks 告诉您泄漏是在哪里分配,而不是实际泄漏发生在哪里。如果库中存在过度保留的错误,您应该修复它(或替换库),而不是试图绕过它。

【讨论】:

以上是关于如何消除其他库引起的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

内存溢出与内存泄漏

内存溢出与内存泄漏

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

如何减少/消除 Angular 应用程序中的内存泄漏

Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

内存泄漏