ios 4.0上的NSXMLParser内存泄漏 - ** NOT ** NSCFString

时间:2010-08-02 01:49:52

标签: iphone memory nsxmlparser memory-leaks

我的NSXMLParser在完成并从内存中释放后,我得到了一个奇怪的泄漏。

它提出了NSMapTable alloc leak。这是我的堆栈:

   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 个答案:

答案 0 :(得分:9)

这可能为时已晚,但我找到了这个解决方案:

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

而不是

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

没有更多内存泄漏...

答案 1 :(得分:1)

你应该在释放([parser setDelegate:nil])

之前重置委托

答案 2 :(得分:1)

这里的问题相同。 即使我只是这样,也会出现泄漏:

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

我已经向苹果报告了这个错误,因为它似乎是NSXMLParser类中的一个严重错误。

答案 3 :(得分:0)

我有同样的问题,Malloc 512 Bytes&amp; NSConcreteMapTable泄漏......如果针对Snow Leopard 10.6进行编译,此代码也不会泄漏

我还可以确认以下代码适用于ios&amp; 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];