0

TouchXMLを使用してXMLを解析しています。「プロファイル」モードで同じものを実行している間。メモリリークを確認できます。この問題を解決するにはどうすればよいですか?

-(NSMutableArray *) grabXML:(NSData *)xmlData andQuery:(NSString *)query {  
    NSMutableArray *blogEntries = [[[NSMutableArray alloc] init] autorelease];  
    CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
    NSArray *resultNodes = [rssParser nodesForXPath:query error:nil];
    for (CXMLElement *resultElement in resultNodes) {
        NSMutableDictionary *blogItem = [[NSMutableDictionary alloc] init];
        int counter;
        for(counter = 0; counter < [resultElement childCount]; counter++) {
            [blogItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
        }
        for( int i = 0; i < [[resultElement attributes] count]; i++) {
            CXMLNode *node = [[resultElement attributes] objectAtIndex:i];
            [blogItem setObject:[[resultElement attributeForName:[node name]] stringValue] forKey:[node name]];
        }
        [blogEntries addObject:[blogItem copy]];
        [blogItem release];
    }
    return [blogEntries copy];
}

上記のメソッドを下記の形式で呼び出しています。

NSMutableArray *arr = [[self grabXML:responseData andQuery:@"//wsCheneliereResult"] autorelease];
4

1 に答える 1

0
[blogEntries addObject:[blogItem copy]];

ここにあなたの間違いがあります:あなたは後で安全に呼び出すことができるようにblogItem、あなたaddObject:は実際にretainその引数をコピーする必要はありません。[blogItem release];

そして、おそらくreturn [blogEntries copy]どちらも行うべきではなく、ただ返すだけblogEntriesです:これは、名前に「copy」または「create」が含まれていないメソッドが自動解放された値を返すという一般的なプログラミングの習慣です。彼ら。

要約すると、私は次のようになります:

-(NSMutableArray *) grabXML:(NSData *)xmlData andQuery:(NSString *)query {  
    NSMutableArray *blogEntries = [[[NSMutableArray alloc] init] autorelease];  
    CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
    NSArray *resultNodes = [rssParser nodesForXPath:query error:nil];
    for (CXMLElement *resultElement in resultNodes) {
        NSMutableDictionary *blogItem = [[NSMutableDictionary alloc] init];
        int counter;
        for(counter = 0; counter < [resultElement childCount]; counter++) {
            [blogItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
        }
        for( int i = 0; i < [[resultElement attributes] count]; i++) {
            CXMLNode *node = [[resultElement attributes] objectAtIndex:i];
            [blogItem setObject:[[resultElement attributeForName:[node name]] stringValue] forKey:[node name]];
        }
        [blogEntries addObject:blogItem];
        [blogItem release];
    }
    return blogEntries;
}

NSMutableArray *arr = [self grabXML:responseData andQuery:@"//wsCheneliereResult"];
于 2012-08-21T15:34:37.097 に答える