0

我在 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;

}

4

1 回答 1

0

每次遍历 for 循环时,都会分配一个新的 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];
}

这将立即释放当前指针使用的内存。

于 2009-07-10T03:03:52.010 回答