在蘋果公司的MVCNetworking示例代碼,所述NetworkManager
類包括(爲了運行NSURLConnection
異步地)這種方法以保持在輔助線程一個運行循環專用於網絡活動:如何管理在輔助線程中運行的NSRunLoop的autorelease池?
- (void)networkRunLoopThreadEntry
{
while(YES) {
NSAutoreleasePool *pool;
pool = [[NSAutorelease alloc] init];
[[NSRunLoop currentRunLoop] run];
[pool drain];
}
}
由於run
方法立即如果退出沒有源代碼連接到運行循環,這看起來像一個無限循環,如果當前沒有NSURLConnection連接到運行循環,它將無用地佔用CPU資源。
在另一方面,以保持運行循環活躍,somesuggests安排在運行循環的空口:
- (void)networkRunLoopThreadEntry
{
NSAutoreleasePool *pool = [[NSAutorelease alloc] init];
NSPort *port = [NSPort port];
[[NSRunLoop currentRunLoop] addPort:port forMode:NSRunLoopCommonModes];
[NSRunLoop run];
[pool drain];
}
然而,在這種情況下,我的擔心是,run
方法永遠不會退出,這意味着池永遠不會被排空,這意味着在次要線程中分配和自動釋放的所有對象都將泄漏。
那麼要走的路是什麼?我想在NSOperation
內部封裝一個異步NSURLConnection
,這意味着它可以在主線程之外被觸發。另外,MVCNetworking示例代碼以及WWDC 2010屆網絡應用程序的iPhone OS,似乎表明它是有專門用於網絡傳輸一個獨特的輔助線程,以防止在主線程等待一個好主意。)
您如何在ARC中執行此操作? – user102008 2014-02-04 07:53:17