簡體   English   中英

內存泄漏與XML解析器中的NSMutableString

[英]Memory Leak with NSMutableString in XML parser

我在我的應用程序中使用XMLparser。 它運行正常,但是當我在儀器中運行我的應用程序時,我不斷在NSMutableString中獲取內存泄漏,NSMutableString處理來自XML的字符串。

Weard事情是這次內存泄漏只在我第二次進行特定呼叫(登錄)時發生。 當我做其他調用時,我沒有內存泄漏。

給出泄漏的NSMutableString是'textInProgress'。

- (NSDictionary *)objectWithData:(NSData *)data
{


    [dictionaryStack release];
    [textInProgress release];

    dictionaryStack = [[NSMutableArray alloc] init];
    textInProgress = [[NSMutableString alloc] init];

    [dictionaryStack addObject:[NSMutableDictionary dictionary]];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    BOOL success = [parser parse];
    [parser release];

    if (success)
    {

        NSDictionary *resultDict = [dictionaryStack objectAtIndex:0];
        return resultDict;
    }

    return nil;
}


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSMutableDictionary *parentDict = [dictionaryStack lastObject];
    NSMutableDictionary *childDict = [NSMutableDictionary dictionary];

    [childDict setObject:attributeDict forKey: NODE_ATTR_KEY];

    id existingValue = [parentDict objectForKey:elementName];
    if (existingValue)
    {
        NSMutableArray *array = nil;
        if ([existingValue isKindOfClass:[NSMutableArray class]])
        {
            array = (NSMutableArray *) existingValue;
        }
        else
        {
            array = [NSMutableArray array];
            [array addObject:existingValue];

            [parentDict setObject:array forKey:elementName];
        }

        [array addObject:childDict];
    }
    else
    {

        [parentDict setObject:childDict forKey:elementName];
    }

    [dictionaryStack addObject:childDict];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];

    if ([textInProgress length] > 0)
    {
        [dictInProgress setObject:textInProgress forKey:NODE_VALUE_KEY];

        [textInProgress release];

        textInProgress = [[NSMutableString alloc] init]; <--- Object leaks here

    }

    [dictionaryStack removeLastObject];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    [textInProgress appendString:string]; <--- Object leaks here

}

我整天都在調試,但仍無法找到解決此問題的方法。 泄漏僅包含64字節的數據。

這里還有兩個儀器泄漏的屏幕截圖 - >泄漏 - >調用樹 在XML解析器foundCharacters泄漏

XML解析器didEndElement泄漏

希望有人能幫助我!


編輯:

這些泄漏的解決方案是將NSMutableString和NSMutableDictionary聲明為屬性。 (請參閱Neal他的評論)

我建議您將textInProgress轉換為屬性而不是ivar。 像這樣:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];

    if ([self.textInProgress length] > 0) {

        [dictInProgress setObject:self.textInProgress forKey:NODE_VALUE_KEY];

        self.textInProgress = [NSMutableString string];
    }

    [dictionaryStack removeLastObject];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    [self.textInProgress appendString:string];
}

並確保您以dealloc發布它

Protip:如果你也改變了屬性對應的ivar的名稱(例如_textInProgress ),你將在之前使用過ivar的每個點都出現構建錯誤,所以你不會錯過從textInProgressself.textInProgress任何更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM