“componentsSeparatedByString”内存泄漏

时间:2011-03-14 14:16:13

标签: objective-c memory-leaks instruments

我在现有的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

4 个答案:

答案 0 :(得分:2)

您发布的代码看起来不像是泄漏内存 - 您调用的所有方法都属于自动释放类型(即没有newalloc,{{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,查看泄露的实例,然后单击该小箭头按钮。您将看到泄漏对象的所有保留和释放,这应该指出您的问题。

Leaks