在不泄漏内存的情况下进行NSMutableString转换?

时间:2009-05-24 14:56:16

标签: memory-management nsstring

我在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 :(得分: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];
}

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