Подстрока Iphone вызывает утечку памяти - PullRequest
2 голосов
/ 10 августа 2010

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

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

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

Так что в основном все, что я делаю, это вытаскиваюраздел «loopstring» и вставка его в строку imagetype, а не просто обрезание конечного пуха строки с помощью метода 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;

}

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

Ответы [ 3 ]

1 голос
/ 10 августа 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: do?

1 голос
/ 19 августа 2010

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

1 голос
/ 10 августа 2010

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

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

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

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

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

...