Problema de Leak

3 views
Skip to first unread message

Mauro Thiago

unread,
May 6, 2011, 11:37:20 AM5/6/11
to xcod...@googlegroups.com
Galera,
estou com um problema. Estou com problema de Leak neste trecho de code. Alguém
sabe me dizer como tirar essa Leak. Já testei várias formas e nada.


Code:
======

-(void) parser:(NSXMLParser *)_parser didStartElement:(NSString *)_element
namespaceURI:(NSString *)_namespace qualifiedName:(NSString *)_name
attributes:(NSDictionary *)_attributes {
__lastLevel = __level++;

if (self.ignoreRoot && __level == 1) return;

NSMutableDictionary *_tmp = [[NSMutableDictionary alloc]
initWithCapacity:2]; // *** RELEASE

if (__tmp != nil) {
[_tmp setObject:__tmp forKey:@"parent"];
//[__tmp release];
} else {
[_tmp setObject:__elements forKey:@"parent"];
//[__elements release];
}

if ([_attributes count] > 0) {
[_tmp setObject:_attributes forKey:@"*"];
}

[__onEdit appendFormat:@"/%@", _element];
__onEditValue = [[NSMutableString alloc] initWithCapacity:255]; // *** DEALLOC
[__onEditValue autorelease];

__tmp = [[_tmp mutableCopy] autorelease];

// NSLog(@"%d", [_tmp retainCount]);
//__tmp = _tmp;
[_tmp release];

if (ON_DEBUG_NCSimpleXML) NSLog(@"Element started at level %i:%i with XPATH:
%@", __level, __lastLevel, __onEdit);
}

======


 
Mauro Thiago da Silva
Web / Desenvolvedor
maurot...@yahoo.com.br
http://about.me/maurothiago/bio

maurothiago

unread,
May 6, 2011, 11:30:36 AM5/6/11
to Xcode Dev

ferbass

unread,
May 6, 2011, 11:24:09 PM5/6/11
to Xcode Dev
Cara defina um NSAutoReleasePool no começø desse codigo e da release
no final deve resolver

Abraço,

Lucas Longo

unread,
May 7, 2011, 6:02:56 AM5/7/11
to xcod...@googlegroups.com
Não entendo para que faz o seguinte:

__tmp = [[_tmp mutableCopy] autorelease];

//    NSLog(@"%d", [_tmp retainCount]);
        //__tmp = _tmp;
        [_tmp release];

Vc esta copiando o objeto para si mesmo...

E tb em geral não e bom usar autorelease... Vc nunca sabe quando o release vai acontecer. 

Finalmente não precisa usar o mutable string com alloc init. Tente sempre usar métodos de classe quando não precisar da variável fora de seu contexto. 

Att,

Lucas
iai? Como funciona?
--
Você está recebendo esta mensagem porque se inscreveu no grupo "Xcode Dev" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para xcod...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para xcode-dev+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/xcode-dev?hl=pt-BR.

Mauro Thiago

unread,
May 7, 2011, 7:51:49 AM5/7/11
to Xcode Dev
Olá Lucas como poderia deixar o código que estou estudando para tirar
o Leak.

Obrigado pela ajuda
Mauro Thiago


On 7 maio, 07:02, Lucas Longo <lu...@iai.art.br> wrote:
> Não entendo para que faz o seguinte:
>
> __tmp = [[_tmp mutableCopy] autorelease];
>
> //    NSLog(@"%d", [_tmp retainCount]);
>
>         //__tmp = _tmp;
>
>         [_tmp release];
>
> Vc esta copiando o objeto para si mesmo...
>
> E tb em geral não e bom usar autorelease... Vc nunca sabe quando o release
> vai acontecer.
>
> Finalmente não precisa usar o mutable string com alloc init. Tente sempre
> usar métodos de classe quando não precisar da variável fora de seu
> contexto.
>
> Att,
>
> Lucashttp://iai.art.br
> iai? Como funciona?

Lucas Longo

unread,
May 9, 2011, 11:14:47 AM5/9/11
to xcod...@googlegroups.com
Não entendi por que tem um _tmp e um __tmp

Use a variável de classe e de um release quando não precisar mais dela...

Por exemplo no parserDidEndDocument...

Eu faria assim:

-(void) parser:(NSXMLParser *)_parser didStartElement:(NSString*)_element namespaceURI:(NSString *)_namespace qualifiedName:(NSString*)_name attributes:(NSDictionary *)_attributes {



__lastLevel = __level++;

if (self.ignoreRoot && __level == 1) return;

if (__tmp == nil)
{
__tmp = [[NSMutableDictionary alloc] init];
[__tmp setObject:__tmp forKey:@"parent"];
}
else
{
[__tmp setObject:__elements forKey:@"parent"];


}

if ([_attributes count] > 0)
{

[__tmp setObject:_attributes forKey:@"*"];


}

[__onEdit appendFormat:@"/%@", _element];

__onEditValue = [[NSMutableString alloc] initWithCapacity:255]; //

[__onEditValue autorelease];

maurothiago

unread,
May 9, 2011, 11:27:34 AM5/9/11
to Xcode Dev
Olá galera,
fiz mais testes e ainda nada.
Adicionei o NSAutoReleasePool e agora me dá um erro de EXC_BAD_ACCESS
na linha "[_tmp setObject:__tmp forKey:@"parent"];"

Alguma sugestão??

Code:
===
-(void) parser:(NSXMLParser *)_parser didStartElement:(NSString
*)_element namespaceURI:(NSString *)_namespace qualifiedName:(NSString
*)_name attributes:(NSDictionary *)_attributes {
__lastLevel = __level++;

if (self.ignoreRoot && __level == 1) return;

NSAutoreleasePool* PoolRemoveLocal = [[NSAutoreleasePool alloc]
init];

NSMutableDictionary *_tmp = [[[NSMutableDictionary alloc] init]
autorelease]; // *** RELEASE

if (__tmp != nil) {
[_tmp setObject:__tmp forKey:@"parent"];
//[__tmp release];
} else {
[_tmp setObject:__elements forKey:@"parent"];
//[__elements release];
}

if ([_attributes count] > 0) {
[_tmp setObject:_attributes forKey:@"*"];
}

[__onEdit appendFormat:@"/%@", _element];
__onEditValue = [[[NSMutableString alloc] initWithCapacity:255]
autorelease]; // *** DEALLOC

__tmp = [_tmp retain];
[_tmp release];

[PoolRemoveLocal drain];

Lucas Longo

unread,
May 9, 2011, 11:33:15 AM5/9/11
to xcod...@googlegroups.com
_tmp ou __tmp não estão alocados e inicializados

maurothiago

unread,
May 9, 2011, 11:49:53 AM5/9/11
to Xcode Dev
Então quando executo sem o Pool vai muito bem, mas aparece uma Leak no
Instruments e,
quando faço com o Pool propriamente dito, ele mata a instância do
__tmp que é global nesta classe.

Como poderia resolver isso?
Já testei de tudo quanto é jeito e o Instruments não dá tregua...
Estou disposto até a mudar o code para verificar se tiro essa Leak.

Thiago



On 9 maio, 12:33, Lucas Longo <lu...@iai.art.br> wrote:
> _tmp ou __tmp não estão alocados e inicializados
>

Lucas Longo

unread,
May 9, 2011, 12:14:56 PM5/9/11
to xcod...@googlegroups.com
Mais fácil enviar o projeto para ver melhor.

Mauro Thiago

unread,
May 9, 2011, 2:30:05 PM5/9/11
to xcod...@googlegroups.com
Olá Lucas, desculpe, mas não posso enviar o projeto completo. Projeto interno de desenvolvimento.

Agradeço pela compreensão.
Thiago




 
De: Lucas Longo <lu...@iai.art.br>
>>>>> xcode-dev+unsub...@googlegroups.com.

>>>>> Para obter mais opções, visite esse grupo emhttp://groups.google.com/group/xcode-dev?hl=pt-BR.
>>
>>> --
>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Xcode Dev" dos Grupos do Google.
>>> Para postar neste grupo, envie um e-mail para xcod...@googlegroups.com.
>>> Para cancelar a inscrição nesse grupo, envie um e-mail para xcode-dev+unsub...@googlegroups.com.

>>> Para obter mais opções, visite esse grupo emhttp://groups.google.com/group/xcode-dev?hl=pt-BR.
>
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Xcode Dev" dos Grupos do Google.
> Para postar neste grupo, envie um e-mail para xcod...@googlegroups.com.
> Para cancelar a inscrição nesse grupo, envie um e-mail para xcode-dev+unsub...@googlegroups.com.

> Para obter mais opções, visite esse grupo em http://groups.google.com/group/xcode-dev?hl=pt-BR.
>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Xcode Dev" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para xcod...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para xcode-dev+unsub...@googlegroups.com.

maurothiago

unread,
May 9, 2011, 1:30:41 PM5/9/11
to Xcode Dev
Até gostaria, mas não posso disponibilizar.

Thiago



On 9 maio, 13:14, Lucas Longo <lu...@iai.art.br> wrote:
> Mais fácil enviar o projeto para ver melhor.
>

maurothiago

unread,
May 9, 2011, 1:45:56 PM5/9/11
to Xcode Dev
Até gostaria, mas não posso disponibilizar. É um projeto interno.

Agradeço pela compreensão.
Thiago



On 9 maio, 13:14, Lucas Longo <lu...@iai.art.br> wrote:
> Mais fácil enviar o projeto para ver melhor.
>
Reply all
Reply to author
Forward
0 new messages