Утечка памяти NSXMLParser на ios 4.0 - ** НЕ ** NSCFString - PullRequest
1 голос
/ 02 августа 2010

Я получаю странную утечку в моем NSXMLParser после того, как это сделано и выпущено из памяти

Это происходит с утечкой при выделении NSMapTable. Вот мой стек:

   0 libSystem.B.dylib calloc
   1 libobjc.A.dylib _internal_class_createInstanceFromZone
   2 libobjc.A.dylib class_createInstance
   3 Foundation NSAllocateObject
   4 Foundation +[NSMapTable alloc] <===== this is the leak...
   5 Foundation -[NSXMLParser initWithData:]
   6 Foundation -[NSXMLParser initWithContentsOfURL:]
   7 idispatch -[RootViewController parseXML:] /Developer/iPhone  Apps/iDispatch/Classes/RootViewController.m:562 <================== this is my code calling
   8 Foundation -[NSThread main]
   9 Foundation __NSThread__main__
  10 libSystem.B.dylib _pthread_start
  11 libSystem.B.dylib thread_start

Идеи

Цени любой свет, который можешь пролить!

Вот код:

[NSThread detachNewThreadSelector:@selector(parseXML:) 
                         toTarget:self 
                       withObject:requestStr];

, который вызывает этот метод в своем собственном потоке:

- (void)parseXML:(NSString*)theURL {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:theURL]];
    DLog(@"URL: %@",theURL);
    [parser setDelegate:self];

    [parser parse];

    [parser release];

    [pool release];
    DLog(@"xml parser thread end and released");
}

Ответы [ 4 ]

9 голосов
/ 05 апреля 2011

Возможно, уже слишком поздно, но я нашел это решение:

NSData * dataXml = [[NSData alloc] initWithContentsOfURL:url];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataXml];
[dataXml release];

вместо

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

Нет утечки памяти ...

1 голос
/ 06 августа 2010

Та же проблема здесь.Утечка появляется, даже если я просто к этому:

NSURL *xmlURL = [NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"myfile.xml"]]; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
[parser release];

Я сообщил об ошибке Apple, так как она кажется серьезной ошибкой в ​​классе NSXMLParser.

1 голос
/ 02 августа 2010

Перед сбросом необходимо сбросить делегат ([parser setDelegate: nil])

0 голосов
/ 06 июля 2011

У меня та же проблема, Malloc 512 Bytes & NSConcreteMapTable Leaks ... также этот код не протекает при компиляции со Snow Leopard 10.6

Я также могу подтвердить, что следующий код работает для ios и mac os без утечек.

        NSData * dataXml = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:query]];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataXml];
    [parser setDelegate:self];
    [dataXml release];
    [parser parse];
    [parser autorelease];
...