2009-05-24 4 views
0

У меня есть эта функция в рамках проекта Objective C для iPhone.Преобразование NSMutableString без утечки памяти?

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

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

- (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; 

}

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^