Делать преобразование NSMutableString без утечки памяти? - PullRequest
0 голосов
/ 24 мая 2009

У меня есть эта функция в классе iPhone проекта Objective C.

Несмотря на то, что это правильно с точки зрения желаемой функциональности, после нескольких вызовов он падает в отладчик.

Так что я думаю, что это плохое управление памятью, но я не уверен, где.

- (NSString *)stripHtml:(NSString *)originalText {
// remove all html tags (<.*>) from the originalText string
NSMutableString *strippedText = [[NSMutableString alloc] init];

BOOL appendFlag = YES;
for( int i=0; i<[originalText length]; i++ ) {
    NSString *current = [originalText substringWithRange:NSMakeRange(i, 1)];
    if( [current isEqualTo:@"<"] )
        appendFlag = NO;
    if( appendFlag ) 
        [strippedText appendString:current];
    if( [current isEqualTo:@">"] )
        appendFlag = YES;
}

NSString *newText = [NSString stringWithString:strippedText];
[strippedText release];
return newText;

}

1 Ответ

0 голосов
/ 10 июля 2009

Каждый раз, когда вы перебираете цикл for, вы выделяете новую строку NSString. Хотя эти строки NSS автоматически освобождаются, они не будут выпущены до тех пор, пока не закончится вся обработка вашего последнего ввода. А пока вы выделите потенциально бесконечное количество памяти. Решение состоит в том, чтобы создать свой собственный пул авто-релизов и сливать его каждую поездку через цикл for. Это будет выглядеть примерно так:

BOOL appendFlag = YES;
for( int i=0; i<[originalText length]; i++ ) {    
NSAutoreleasePool *pool = [NSAutoreleasePool new];
// rest of for loop body
[pool drain];
}

Это сразу освободит память, используемую вашим текущим указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...