2010-12-06 63 views
2

我呼籲在單獨的線程在viewDidLoad方法的方法在iPhone中使用多線程時如何處理泄漏?

[NSThread detachNewThreadSelector:@selector(callWebService) toTarget:self withObject:nil]; 

-(void)callWebService{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
[NSThread detachNewThreadSelector:@selector(loadImages) toTarget:self withObject:nil]; 
[pool release]; 
    } 
-(void)loadImages{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self performSelectorOnMainThread:@selector(reloadTable) withObject:nil waitUntilDone:false]; 
[pool release]; 
} 
-(void)reloadTable 
    { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[myTableView reloadData]; 
[pool release]; 

} 

同時使用線程如何處理泄漏?我想使用線程。

錯誤

*** __NSAutoreleaseNoPool(): Object 0x604b830 of class NSCFString autoreleased with no pool in place - just leaking 

*** -[NSAutoreleasePool release]: This pool has already been drained, do not release it (double release). 

回答

0

自動釋放池必須drain,不release。所以我認爲如果你把它改成[pool drain]它應該可以正常工作。

+0

仍存在相同問題 – Warrior 2010-12-06 15:21:02

0

不知道你是否找到了你的答案,但由於我碰到了類似於你的問題,我做了一些尋找。看起來,當你耗盡一個游泳池時,這(有效)等同於釋放它。在類的文件說:

既然你不能保持一個自動釋放池(或自動釋放它,看到 保留並自動釋放),排水池,最終有 重新分配它的效果。

所以,你應該只消耗一次池。如果在該點之後需要另一個上下文,則應該使用與先前在代碼中生成相同的方式生成新的池。

如果沒有可用的池,那麼最終可能會泄漏(如您所述)。但是,autorelease調用應該在該實例中記錄警告消息。關於線程,文檔,有這樣一段話

的應用套件在 創建主線程自動釋放池事件循環的每個週期的開始,和水渠它在 結束,從而釋放任何自動釋放生成的對象 處理事件。如果您使用應用套件,則您通常不需要創建您自己的池。但是,如果您的應用程序 在事件循環中創建了大量臨時自動發佈的對象,但是,創建「本地」自動釋放池到 可能有助於最大限度地減少峯值內存佔用量。

希望這會有所幫助。