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

时间:2012-02-21 07:11:37

标签: iphone objective-c memory-management memory-leaks xcode-instruments

在我的应用程序中,我正在使用一个库直接返回NSMutableArray中的sql查询结果。当我使用仪器时,它显示了存储结果的数组的内存泄漏。所以库的创建者没有处理正确的数组的init-release。那么有什么方法可以处理我的代码中libary外部的数组引起的内存泄漏?代码如下:

-(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的内存泄漏。释放或自动释放这些数组并不能解决内存泄漏。解决这些泄漏的唯一方法是它们是否可以由库的创建者解决?而且我也得到了内存泄漏如果

(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?

2 个答案:

答案 0 :(得分:2)

您是否尝试过不止一次发布它们?像:

[array release];
[array release];

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

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

答案 1 :(得分:1)

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

同样,你的代码有一些严重的问题;不应将get用作前缀,直接检查error以确定错误是否发生错误等等......

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