2010-08-02 35 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];