下面是MREntitiesConverter对象的@interface,我使用NSXMLParser从字符串中剥离所有html标签。

@interface MREntitiesConverter : NSObject {
    NSMutableString* resultString;
    NSString* xmlStr;
    NSData *data;
    NSXMLParser* xmlParser;
}
@property (nonatomic, retain) NSMutableString* resultString;
- (NSString*)convertEntitiesInString:(NSString*)s;
@end


这是实现:

@implementation MREntitiesConverter
@synthesize resultString;
- (id)init
{
    if([super init]) {
        self.resultString = [NSMutableString string];
    }
    return self;
}

- (NSString*)convertEntitiesInString:(NSString*)s {
    xmlStr = [NSString stringWithFormat:@"<data>%@</data>", s];
    data = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    xmlParser = [[NSXMLParser alloc] initWithData:data];

    [xmlParser setDelegate:self];
    [xmlParser parse];

    return [resultString autorelease];
}

- (void)dealloc {
    [data release];
    //I want to release xmlParser here but it crashes the app
    [super dealloc];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)s {
    [self.resultString appendString:s];
}
@end


如果我在dealloc方法中释放xmlParser,将导致我的应用崩溃,但没有释放,则很明显是在泄漏内存。

我是Instruments的新手,正在尝试优化此应用程序。您可以针对此特定问题提供的任何帮助都可能会帮助我解决应用程序中的其他内存问题。

您沮丧的期望:) Oisin

最佳答案

您的类和NSXMLParser都在释放数据,这会导致当前崩溃。唯一的成员应该是resultString。您应该在convertEntitiesInString中初始化resultString:而不是init,因此同一实例可以多次使用。您应该从convert返回self.resultString或[[resultString保留]自动释放],因为如果您在dealloc中释放resultString,则当前执行的操作将导致以后的双重释放。您应该在parser:foundCharacters:中直接使用resultString,而不是方法调用self.resultString。

关于iphone - 如何在不使我的应用程序崩溃的情况下发布此NSXMLParser?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2680095/

10-12 02:47