Утечка памяти "componentsSeparatedByString" - PullRequest
0 голосов
/ 14 марта 2011

Я столкнулся с какой-то странной утечкой памяти в нашем существующем приложении для 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, но потом я объясняю, что это существующий код, а если я изменил код, это слишком много времени)

Любое предложение?

С уважением Панкадж Гадхия

Ответы [ 4 ]

2 голосов
/ 14 марта 2011

Код, который вы разместили, не выглядит как утечка памяти - все методы, которые вы вызываете, имеют тип автоматического выпуска (т. Е. Нет new, alloc, copy или retain в коде).

Вероятно, у вас есть код, который вызывает retrieveInfo и что-то делает с результатом, который приводит к утечке памяти (например, чрезмерное его сохранение). Инструмент утечки указывает вам на componentSeparatedByString, потому что именно там была выделена память, которая в конечном итоге была связана с утечкой памяти.

Можете ли вы показать нам, как вы звоните retrieveInfo и что вы делаете с результатом?

Кстати, какой смысл в этом вложении, если?

if([arrRetrive count]!=0){
   if ([arrRetrive count]!=1)

Это расточительно, вы можете написать это и получить тот же эффект:

if ([arrRetrive count] > 1)
0 голосов
/ 22 июля 2011

Что вы делаете с объектом, который возвращается этим методом? [arrRetrive objectAtIndex:0] вероятно то, что просочилось.

Утечки указывают на эту строку с componentsSeparatedByString:, потому что именно там расположены строки в массиве. Но массив не пропущен.

Зайдите в Утечки, посмотрите на протекший экземпляр и нажмите эту маленькую кнопку со стрелкой. Вы увидите все удержания и выпуски утекшего объекта, которые должны указать вам на проблему.

Leaks

0 голосов
/ 14 марта 2011

Вы пропускаете NSArray при повторном назначении нового NSArray внутри блока if. Указатель на исходный массив потерян, что означает, что 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;
}
0 голосов
/ 14 марта 2011

Эта утечка, вероятно, означает, что вы чрезмерно сохраняете возвращаемое значение.А инструмент утечки просто показывает вам место, где он был создан.

...