Подстрока iPhone вызывает утечку памяти

Я только заканчиваю свое приложение, поэтому приступаю к запуску инструментов для выявления утечек в приложении. Я столкнулся с утечкой, которую не могу понять, почему она регистрируется как утечка.

Например, у меня есть следующие строки:

NSString *imageType = [[[NSString alloc] initWithString:[loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location]] autorelease];
imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length];

Таким образом, в основном все, что я делаю, - это вытаскивание части «петли» и помещение ее в строку типа изображения, а не просто отрезание конечного пуха строки с помощью метода SubstringFromIndex.

Когда я запускаю инструменты, он говорит об утечке «NSCFString substringwithRange». Он выделяет вторую строку:

imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length];

Я думаю, что метод substringFromIndex должен возвращать строку, которая автоматически добавляется в пул автоматического выпуска.

Любые идеи о том, где я ошибаюсь?

Спасибо

Ниже приведен рефакторинговый код:

- (void)SetupTop10:(NSString *)Top10Data
{
while (Top10Data != @"") {
    NSLog(Top10Data);
    if ([Top10Data rangeOfString:@"</TOP10ENTRY>"].location == NSNotFound){
        Top10Data = @"";
    }
    else
    {

        NSString *loopString = [Top10Data substringToIndex:[Top10Data rangeOfString:@"</TOP10ENTRY>"].location + 13];
        Top10Data = [Top10Data stringByReplacingOccurrencesOfString:loopString withString:@""]; 

        //NOW CREATE A RECORD FOR THIS ITEM
        NSString *imageType = [loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location];
        imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + 7];
        NSString *displayText = [loopString substringToIndex:[loopString rangeOfString:@"</DISPLAYTEXT>"].location];
        displayText = [displayText substringFromIndex:[displayText rangeOfString:@"<DISPLAYTEXT>"].location + 13];
        NSString *link = [loopString substringToIndex:[loopString rangeOfString:@"</INTERESTID>"].location];
        link = [link substringFromIndex:[link rangeOfString:@"<INTERESTID>"].location + 12];
        [Top10Images addObject:imageType];
        [Top10Links addObject:link];
        [Top10s addObject:displayText];
        Top10RowCount = Top10RowCount + 1;
    } 
}

[self.Top10Table reloadData];
Top10Table.hidden = NO;
loadingLabel.hidden = YES;
loadingIndicator.hidden = YES;

}

//******************


person Trevor    schedule 09.08.2010    source источник
comment
Не было бы хорошей идеей сделать копию параметра Top10Data, так как вы, возможно, изменяете его?   -  person Rengers    schedule 11.08.2010


Ответы (3)


Он не выглядит дырявым. Но почему

NSString *imageType = [[[NSString alloc] initWithString:
             [loopString substringToIndex:[loopString
                                             rangeOfString:@"</IMAGE>"].location]
         ] autorelease];

если вы эффективно получите то же самое с

NSString *imageType = [loopString substringToIndex:[loopString
                                             rangeOfString:@"</IMAGE>"].location];

с половиной использования памяти?

person mvds    schedule 09.08.2010
comment
Извините, это было мое первое приложение, так что еще осталось немного хакерского кода. Но это не объясняет причину, по которой он должен течь. - person Trevor; 10.08.2010
comment
А также вторая строка должна быть: imageType = [imageType substringFromIndex:[imageType rangeOfString:@‹IMAGE›].location + @‹IMAGE›.length]; - person Trevor; 10.08.2010
comment
вы должны понимать, что инструменты — это тоже просто инструмент, который может ошибаться. Поддержание чистоты и порядка в коде помогает предотвратить их. попробуйте изменить @"<IMAGE>".length на 7. Вы уверены, что вокруг этих строк нет другого хакерского кода? - person mvds; 10.08.2010
comment
Да, я только что провел рефакторинг кода, удалив initwithstring, а также изменил @‹IMAGE›.length на 7, но проблема осталась. - person Trevor; 10.08.2010
comment
Пожалуйста, обновите свой вопрос текущим кодом, чтобы мы все знали, о чем говорим. Также скажите, что происходит с imageType после этих строк. - person mvds; 10.08.2010
comment
Привет, mvds, я разместил обновленный код в вопросе. Все, что я делаю, это перебираю строку и помещаю записи в MutableArrays. - person Trevor; 10.08.2010
comment
Правильно ли выпущены изменяемые массивы? - person mvds; 10.08.2010
comment
Да, массивы освобождаются в Dealloc. - person Trevor; 10.08.2010
comment
Тогда нет утечки памяти, основываясь на информации, которую вы здесь даете. - person mvds; 10.08.2010
comment
Вы отрефакторили его, но для записи: @String.length не является правильным Objective-C, поскольку длина не определена как свойство. Должно быть [@String length]. Это (очевидно) не причина вашей утечки, а ошибка. - person Steven Fisher; 20.08.2010

Утечки сообщат вам, где была выделена утечка памяти. Если вы щелкнете вокруг (я думаю, рядом с адресом памяти есть значок со стрелкой вправо), вы сможете просмотреть все распределения/сохранения/освобождения для этих адресов.

В этом примере Leaks укажет вам на первую строку, в то время как пятая «утечка» (на самом деле это отсутствующий выпуск в Dealloc/on присваивании, который утечет):

NSString * s = [someString substringFromIndex:1];
[myArray addObject:s];
// ...
NSString * s2 = [myArray lastObject];
instanceVariable = [s2 retain];
// ... and forget to release in dealloc

Что делает tableView:cellForRowAtIndexPath:?

person tc.    schedule 10.08.2010

Я не вижу никакой проблемы в приведенном выше коде. Вы освободили Top10Images в своем методе Dealloc?

person joerick    schedule 18.08.2010
comment
Или, возможно, где-то было сохранено дополнительное время. Или, возможно, к объекту обращались из Top10Images и где-то сохранялось дополнительное время. Но причина утечки будет вне предоставленного кода. - person Steven Fisher; 20.08.2010