我在现有的iPad应用程序中面临一些奇怪的内存泄漏, 这是一个在仪器中发生内存泄漏的函数
-(NSString *)retriveInfo:(NSString*)fromstring:(NSString*)searchstring
{
NSArray *arrRetrive = [fromstring componentsSeparatedByString:searchstring];
if([arrRetrive count]!=0){
if ([arrRetrive count]!=1){
NSString *strDisplayOrder = [arrRetrive objectAtIndex:1];
arrRetrive = [strDisplayOrder componentsSeparatedByString:@"<"]; //MEMORY LEAK
}
}
return [arrRetrive objectAtIndex:0];
}
这是输入参数
Param 1 : <displayorder>1</displayorder><filename>201103153_0100.pdf</filename><title>【1面】東日本巨大地震直撃、日経平均一時675円安[br]原発関連売られる、東電はS安</title><category>トップ・注目株</category><dirpath>/var/www/mssite/webapp/data/pdf/20110315</dirpath><TimeStamp>201103141700</TimeStamp><FirstPageImg>20110315top.png</FirstPageImg></pagedata>
Param 2: <displayorder>
基本上我想在开始和结束标记之间找到(解析)值。 (我知道NSXMLParser类,但asper我解释这个是现有代码,如果我在代码中更改它太耗费时间)
任何建议?
关心 Pankaj Gadhiya
答案 0 :(得分:2)
您发布的代码看起来不像是泄漏内存 - 您调用的所有方法都属于自动释放类型(即没有new
,alloc
,{{1代码中的{},或copy
。
这可能是你调用retain
的代码,并对结果导致内存泄漏(例如过度保留)。泄漏工具指向componentsSeparatedByString,因为这是分配内存的地方,最终导致内存泄漏。
您能否告诉我们您如何致电retrieveInfo
以及如何处理结果?
顺便问一下,这个嵌套的问题是什么?
retrieveInfo
这很浪费,你可以写下这个并获得相同的效果:
if([arrRetrive count]!=0){
if ([arrRetrive count]!=1)
答案 1 :(得分:0)
泄漏可能意味着您过度保留了返回值。泄漏工具只会向您显示创建它的位置。
答案 2 :(得分:0)
当您在if块中重新分配新的NSArray
时,您正在泄漏NSArray
。指向原始数组的指针将丢失,这意味着runloop无法释放为第一个结果分配的内存。为第二个结果分配的内存被释放。
您应该使用正确的解析器...但是为了解决泄漏问题,以下内容将起作用。
-(NSString *)retriveInfo:(NSString*)fromstring:(NSString*)searchstring
{
NSArray *arrRetrive = [fromstring componentsSeparatedByString:searchstring];
NSString *result = nil;
if([arrRetrive count]!=0){
if ([arrRetrive count]!=1){
NSString *strDisplayOrder = [arrRetrive objectAtIndex:1];
result = (NSString *)[[strDisplayOrder componentsSeparatedByString:@"<"] objectAtIndex:0];
}
}
return result;
}
答案 3 :(得分:0)
您如何处理此方法返回的对象? [arrRetrive objectAtIndex:0]
很可能是被泄露的。
Leaks表示与componentsSeparatedByString:
对齐,因为这是分配数组中字符串的位置。但阵列没有泄露。
进入Leaks,查看泄露的实例,然后单击该小箭头按钮。您将看到泄漏对象的所有保留和释放,这应该指出您的问题。