2011-02-02 90 views
1

我使用NSData保護iOS 4.2上的文件。 文件剛剛使用web服務下載到臨時文件夾,現在我想複製和保護它變成使用NSData的最終目的地和下面的代碼:NSData在保護文件時將整個文件內容保存在內存中時進行流式傳輸嗎?

NSData oData = NSData.FromFile (sSourcePathAndFile); 
NSError oError = null; 
oData.Save (sDestPathAndFile, NSDataWritingOptions.FileProtectionComplete, out oError); 

我想知道:如果文件現在真的很大,NSData會將它保存在塊中,還是會將整個文件加載到內存中,最終運行內存不足,並且會失敗?

旁註:如果我備份我的iOS設備並恢復到其他設備,受保護的文件是否可以在那裏讀取?如果是的話,整個保護措施對我來說就沒有多大意義。

回答

1

從檢查的MonoTouch文檔(雖然我不是專家),NSData.FromFile似乎恰好映射到的Objective-C:

NSData +dataWithContentsOfFile: 

導致整個文件被立即加載到內存中。這是每this page - 「一個數據對象通過讀取路徑指定的文件中的每個字節」,這是蘋果的NSData參考的the relevant bit非常字。

似乎沒有成爲一個MonoTouch的相當,但在Objective-C的正確的事是使用:

NSData +dataWithContentsOfMappedFile: 

如記錄here

iOS與所有其他操作系統一樣具有完全虛擬化的內存子系統,它只是缺少一個頁面文件。在使用dataWithContentsOfMappedFile時:將文件映射到主內存,從而導致正常的分頁機制在物理RAM中保留儘可能多的或儘可能少的空間,因爲有足夠的空間可以容納,就像其他虛擬內存池一樣。

雖然dataWithContentsOfMappedFile:可能回退到dataWithContentsOfFile:在某些環境中(儘管它不應該在iOS),該系統不能代替dataWithContentsOfMappedFile:爲dataWithContentsOfFile:在所有情況下,因爲前者需要的文件保持不變的磁盤在NSData對象的生命週期期間,而後者保證立即讀取所有內容,並允許您隨後刪除或修改原始數據。

希望有人更多的是一個monotouch專家可以建議如何添加NSData.FromMappedFile或通過其他方式如何顯示此功能。

+0

另外我會下載並加密1GB文件,看看會發生什麼。 – Krumelur 2011-02-02 16:24:21

+0

我建議使用NSDataReadingMapped選項而不是+ dataWithContentsOfMappedFile :.這也可能是單點觸摸,因爲它似乎支持選項標誌... – 2011-02-02 19:58:30

0

如果要控制緩衝區的大小以便設備不會耗盡內存,可以打開FileStream(System.IO)並手動寫入字節。這是MonoTouch的優點。你可以使用.NET框架。