2010-05-22 32 views
1

在我的iPhone應用程序中,我有一個NSXMLParser實例,它被設置爲一個自定義委託來讀取XML。然後將它移動到它自己的線程中,以便它可以更新後臺中的數據。然而,自從我這樣做以來,它在控制檯中給了我很多_NSAutoreleaseNoPool警告。我試圖添加一個NSAutoreleasePool到我的每個委託類,但是,這似乎沒有解決問題。如果發生故障,我已經包含了創建NSXMLParser的方法。停止導致NSXMLParser實例_NSAutoreleaseNoPool

NSURL *url = [[NSURL alloc] initWithString:@"http://www.mywebsite.com/xmlsource.xml"]; 
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

CustomXMLParser *parser = [[CustomXMLParser alloc] init]; 

parser.managedObjectContext = self.managedObjectContext; 

parser = [parser initXMLParser]; 

[xmlParser setDelegate:parser]; 

[NSThread detachNewThreadSelector:@selector(parse) toTarget:xmlParser withObject:nil]; 

如果任何人有任何想法,以擺脫這個問題,我真的很感激它。

謝謝。

回答

2

在objective-c中,每個線程都需要自己的NSAutorelease池來處理自動釋放的對象。因此,在您parse方法,你需要創建(和釋放)NSAutoreleasePool對象:

- (void)parse{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    ... 
    // your method implementation 
    ... 
    [pool release]; 
} 
+1

這是最好的@try {...} {@finally [池釋放]包一切; }如果你得到一些破壞線程的異常。當然,例外情況可能會中止您的應用,但仍然可以。 – 2010-05-22 20:20:47

+0

感謝Mike,好點 – Vladimir 2010-05-22 20:24:34

+0

感謝您的回覆Vladimir!但是,我在NSXMLParser上調用解析 - 我是否需要重寫這個地方? – PF1 2010-05-22 23:17:53