在我的应用程序中,我正在使用一个库直接返回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?
答案 0 :(得分:2)
您是否尝试过不止一次发布它们?像:
[array release];
[array release];
通常情况下我不推荐它,但如果案例是库返回它们被不正确地保留,这可以解决问题。尝试查看这些数组的 retainCount 属性,以查看它们保留的次数。请记住,此属性主要用于调试,可能会产生奇怪的结果。
如果你决定使用这种方法,你必须广泛测试稳定性。
答案 1 :(得分:1)
无论你使用哪种库,它似乎都设计得很糟糕。具体来说,在NSMutableArray(或NSArray)上添加一个类别来执行数据库访问是一种可怕的反模式。
同样,你的代码有一些严重的问题;不应将get
用作前缀,直接检查error
以确定错误是否发生错误等等......
最后,泄漏会告诉您分配泄漏的位置,而不是发生实际泄漏的位置。如果库中存在过度保留错误,您应该修复它(或替换库)而不是试图破解它。