2013-06-28 63 views
3

在iOS上,我們的應用程序正在下載大約400MB的zip文件。文件下載時,我們會間歇性地崩潰。iOS:NSFileHandle vs NSOutputStream用於大文件下載

當前我正在使用[NSFileHandle writeData:]來寫入數據,因爲它到來,並沒有被存儲在內存中。但我想知道操作系統是否以某種方式將其存儲在內存中?

NSOutputStream是下載大文件的更好的解決方案嗎?或者可能是標準的unix文件描述符?

我們的文件句柄的設置是這樣的:

NSFileManager * fileManager = [NSFileManager defaultManager]; 
[fileManager createFileAtPath:tmpFilePath.path contents:nil attributes:nil]; 
_zipFile = [NSFileHandle fileHandleForWritingAtPath:tmpFilePath.path]; 

目前我NSURLConnection的委託方法如下:

- (void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data { 
    [_zipFile writeData:data]; 
} 

所以從請求進來的數據不存儲或追加到任何其他數據對象。不應該只寫入磁盤而不影響內存?

感謝

+0

我用'NSOutputStream'正是這個目的,它工作正常(這是蘋果在演示模式[SimpleURLConnections樣品(HTTP:。。/ /developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245)。)但我只是嘗試了兩種方式,而且兩者看起來都很恭敬內存消耗方面(40MB文件,內存在下載過程中加速到3mb,但在1mb時快速平穩)。我懷疑問題必須放在其他地方(殭屍或別的東西)。你是如何得出結論:NSFileHandle是問題? – Rob

+0

你在使用殭屍嗎?分配工具報告什麼? – Rob

+0

此下載是應用程序中唯一發生的事情。應用程序的其餘部分取決於下載的這個zip文件,因此有一個視圖控制器和一個進度條用於此下載。您會推薦我使用哪種儀器工具來監控? – gngrwzrd

回答

3

我不認爲有什麼不對您的使用NSFileHandle。我承認我總是使用NSOutputStream,但我只是嘗試了兩種方法(NSFileHandleNSOutputStream),並且在內存消耗方面都表現得相當恭敬。下載一個40MB的文件,將分配飆升至3MB的下載,但很快開始在1MB持平):

allocations and leaks

所以,我想通過「分配」和「泄漏」運行你的應用程序(如果你選擇「泄漏」,你會得到兩個),看看它是什麼樣子。

如果您還沒有,請通過靜態分析器(「產品」菜單上的「分析」)運行您的代碼,以確保您沒有任何問題。 (你應該在那裏有一個乾淨的健康法案;如果有任何問題報告,你必須解決這些問題。)我還要確保關閉殭屍(因爲在跟蹤所有這些發佈的對象的過程中,它爲每創建一個殭屍對象...小,但它會消耗內存