如何消除其他库引起的内存泄漏?
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 告诉您泄漏是在哪里分配,而不是实际泄漏发生在哪里。如果库中存在过度保留的错误,您应该修复它(或替换库),而不是试图绕过它。
【讨论】:
以上是关于如何消除其他库引起的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏