1

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

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

2 回答 2

2

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

[array release];
[array release];

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

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

于 2012-02-21T07:44:20.237 回答
1

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

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

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

于 2012-02-22T18:18:26.700 回答