2010-08-02 52 views
1

当我的NSXMLParser完成并从内存中释放后,我得到了一个奇怪的泄漏。ios 4.0上的NSXMLParser内存泄漏 - ** NOT ** NSCFString

它出现了NSMapTable的alloc泄漏。这是我的堆栈:

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"); 
} 
+0

你能显示一些代码吗?它有点难以从错误信息中反转你的代码。特别是在您创建NSXMLParser的地方,很高兴看到 – 2010-08-02 01:54:31

+0

schone:使用此代码更新您的原始问题,而不是将其粘贴为评论。 – iwasrobbed 2010-08-02 02:12:19

+0

这是一个解决方法:http://blog.filipekberg.se/2010/11/30/nsxmlparser-has-memory-leaks-in-ios-4/ – 2010-11-30 14:33:48

回答

1

你应该释放前重新委托([解析器setDelegate:无])

+0

仍然得到同样的泄漏,并且还得到两个额外的小说Malloc 512字节帧[allocateCollectableUnscannedStorage] 的想法? – schone 2010-08-02 02:31:29

+0

你有没有试过泳池,只是为了看看是否有差异? – 2010-08-02 02:36:48

+0

雅它崩溃说我想产生一个没有自己的泳池线程....它不喜欢我,当我这样做:) – schone 2010-08-02 02:37:48

1

这里同样的问题。 泄漏出现哪怕我只是这样:

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

我报告的错误的苹果,因为它似乎在的NSXMLParser类一个严重的错误。

+0

感谢您提供答案。我有点担心我真的没有得到基本的东西,并且它一直出现在所有使用NSXMLParser的应用程序中。 – schone 2010-08-07 17:10:32

9

这也许为时已晚,但我发现这个解决方案:

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

,而不是

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

没有更多MEM泄漏......

+0

正是我所需要的,这清除了内存泄漏。 – 2011-04-23 16:12:31

0

我有同样的问题,malloc的512个字节& NSConcreteMapTable Leaks ...此代码不泄漏,如果编译对雪豹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];