2014-09-25 72 views
0

是否有一種技術可以通過在分配內存之前測試內存的可用性來避免不必要的內存消耗?我知道一般的iOS方法是優化內存使用情況並在必要時響應didReceiveMemoryWarning,但有時不會削減它。iOS:在分配對象之前檢測內存限制

在我的用例(圖像處理)中,我使用UIGraphicsBeginImageContext()爲一個(可能)大的圖像分配空間。如果圖片太大,我最終會收到didReceiveMemoryWarning。但是,在這一點上已經太晚了:從用戶體驗的角度來看,最好防止用戶從這麼大的圖像開始工作;這會更有意義地說,「對不起,圖片尺寸太大了!做點別的!」在創造它之前,比說「Ooops!現在崩潰!」

我在查詢可用內存和/或全部物理內存時發現了一些SO線程,但是使用它們是一個混亂且不可靠的解決方案:無法告訴操作系統實際上將允許您使用多少內存給定時間點,不管有多少空閒。

基本上,我想這些語義:(在 「雨燕的Java-ESE」)

try { 
    UIGraphicsBeginImageContext(CGRect(x: reallyBig, y: reallyBig)) 
} 
catch NotEnoughMemoryException { 
    directUserToPickSmallerImage() 
} 

// The memory is mine; it's OK to use it 
continueUsingBigImage() 

是否有iOS中這樣的方法?

+0

重新例外:在iOS中,例外是爲編程不可恢復的錯誤而保留的。從技術上講,跨棧幀恢復存在問題。你可以嘗試使用'NSData dataWithBytes:length:'預先檢查並檢查是否爲零。 – zaph 2014-09-25 19:56:29

+0

哦,我沒有字面意思是拋出一個異常 - 我只是指成功/即時失敗語義。 (對不起!這太讓人困惑了......)NSData的想法可能會奏效,但它需要使用你無法快速完成的malloc。 – 2014-09-25 20:18:10

+0

也許更好的方法是限制你的應用程序處理最大大小和位深度。來自當前設備相機的最大圖像看起來像是一個合理的限制。 – danh 2014-09-25 20:25:43

回答

0

您可以嘗試使用NSMutableDatavar length: Int預檢,並檢查是否爲零。

let data: NSMutableData? = NSMutableData(length:1000) 
if data != nil { 
    println("Success") 
} 
else { 
    println("Failure") 
} 
+0

好的,這可以工作......但我怎麼知道iOS不會在稍後想要回憶?如果確實如此,我該如何明確釋放它? – 2014-09-25 20:46:02

+0

它具有與任何其他變量相同的生命週期,具體取決於它如何聲明,本地或伊維爾。如果你想更密切地控制生命期,你可能會使用'autoreleasepool {}'。如果該示例被封裝在'autoreleasepool'中,則分配將在範圍的退出時進行並釋放。 – zaph 2014-09-25 20:58:30

+0

當沒有剩餘的分配時,它會在最近的封閉'autoreleasepool'的末尾釋放,通常是運行循環。通過添加你自己,你可以更仔細地控制發佈。在一個運行循環內進行大量臨時分配時,這非常方便。 (酒店WiFi像瘋了似的彈起來,真的很難發佈。) – zaph 2014-09-25 21:08:54