Pergunta

Atualização:Eu editado o código, mas o problema persiste...

Olá a todos,
este é meu primeiro post aqui que eu encontrei este lugar uma grande recursos para a resolução de muitas das minhas perguntas.Normalmente eu tento o meu melhor para corrigir alguma coisa no meu próprio, mas desta vez eu realmente não tenho nenhuma idéia o que está errado, então eu espero que alguém possa me ajudar.
Eu estou construindo um aplicativo para iPhone que analisa um par de arquivos xml usando TouchXML.Eu tenho uma classe XMLParser, que se encarrega de baixar e analisar os resultados.Eu estou ficando vazamentos de memória quando eu analisar um arquivo xml mais de uma vez com a mesma instância do XMLParser.Aqui está um dos a análise de trechos de código (apenas a parte relevante):

for(int counter = 0; counter < [item childCount]; counter++) {  
        CXMLNode *child = [item childAtIndex:counter];
        if([[child name] isEqualToString:@"PRODUCT"]) 
        {
            NSMutableDictionary *product = [[NSMutableDictionary alloc] init];
            for(int j = 0; j < [child childCount]; j++) {
                CXMLNode *grandchild = [child childAtIndex:j];
                if([[grandchild stringValue] length] > 1) {
                    NSString *trimmedString = [[grandchild stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                    [product setObject:trimmedString forKey:[grandchild name]];
                }
            }

            // Add product to current category array
            switch (categoryId) {
                case 0:
                    [self.mobil addObject: product];
                    break;
                case 1:
                    [self.allgemein addObject: product];
                    break;
                case 2:
                    [self.besitzeIch addObject: product];
                    break;
                case 3:
                    [self.willIch addObject: product];
                    break;
                default:
                    break;
            }
            [product release];
        }

    }  

A primeira vez, eu analisar o xml nenhum vazamento mostra-se em instrumentos, a próxima vez que eu faço, eu tenho um monte de vazamentos (NSCFString / NSCFDictionary).
Instrumentos de pontos mim esta parte dentro CXMLNode.m, quando eu cavar um objeto perdido:

theStringValue = [NSString stringWithUTF8String:(const char *)theXMLString];
if ( _node->type != CXMLTextKind )
   xmlFree(theXMLString);
}

return(theStringValue);  

Eu realmente passei um longo tempo e tentou vários métodos para corrigir este problema, mas sem sucesso até agora, talvez eu estou faltando alguma coisa essencial?

Qualquer ajuda é muito apreciada, obrigado!

Foi útil?

Solução

A questão provavelmente está nesta linha:

[self.mobil addObject:[product copy]];

Pedindo uma cópia de product você está criando uma nova instância do nsmutabledictionary com uma contagem de retenção de 1. o mobil instância, no entanto, aumentará a contagem de retenção da cópia quando você o enviar o addObject: Mensagem, então a contagem de retenção da cópia é agora 2. De um modo geral, um objeto é responsável por lidar com sua própria memória de objeto, então sempre que você enviar uma mensagem setFoo: ou addObject:, você pode simplesmente passar no objeto diretamente, mesmo que seja autorizado ou planeja lançá -lo logo após a chamada; É responsabilidade do receptor manter o objeto que você está passando, se precisar se apegar a ele.

Como você não atribuiu a cópia a nenhuma variável, você não tem um ponteiro que pode usar para diminuir a contagem de retenção da cópia agora que não está mais interessado nela, portanto, mesmo que mobil libera a cópia do produto em algum momento, a cópia nunca atingirá uma contagem de retenção de 0. seu [product release] declaração no final do loop for lançada o original product objeto, não a cópia que você criou.

Em vez disso, tente o seguinte e veja se os instrumentos estão mais felizes:

[self.mobil addObject:product];

Outras dicas

Em termos simples, toda vez que você usa copy, você também tem que usar release/autorelease em algum lugar.

E neste caso, a resposta ainda mais fácil é não usar copy Em primeiro lugar, já que você não está fazendo nada com a versão original de product Depois de copiar.

Eu fixo o mesmo problema.Era uma espécie de bobo, mas talvez alguém pode se deparar com a mesma coisa, então eu vou postar aqui.

1) eu tinha mutável matriz configuradas como variáveis de instância como este:

@interface XMLParser : NSObject {

// ...  
NSMutableArray *mobil;  
// ...  
}   
@property(nonatomic, retain) NSMutableArray *mobil;  
@end  

Toda vez que eu queria restaurar novos dados dentro eu fiz:
auto.mobil = nil;
O que não era o que eu queria fazer, então este é o melhor abordagem:
[auto.mobil removeAllObjects];

2) O método dealloc tem que ser assim para corrigir os vazamentos (porque mobil é definida como uma propriedade):
-(void)dealloc {
[mobil release];
auto.mobil = nil;
}

Ufa, que tem sido muito trabalho para descobrir - espero que salva alguém de algum tempo :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top