2015-05-19 20 views
4

嗨,我正在開發一個應用程序,我需要chache 50個圖像(所有圖像的大小爲2.5 mb),這是chaching的圖像,但也增加了10 MB的內存Apple Watch App因應用程序崩潰。觀看套件應用程序:由於內存錯誤而終止

Xcode中給出xcode的錯誤「消息從調試器:終止,因爲該存儲器的錯誤」

我使用的代碼如下:

for (var i : Int = 1; i<26; i++) { 

      let filenameHuman = NSString(format: "human_%d", i) 
      let filenameZombie = NSString(format: "zombie_%d", i) 

      var imageHuman : UIImage! = UIImage(named: filenameHuman as String) 
      var imageZombie : UIImage! = UIImage(named: filenameZombie as String) 

      WKInterfaceDevice.currentDevice().addCachedImage(imageZombie, name: filenameZombie as String) 

      WKInterfaceDevice.currentDevice().addCachedImage(imageHuman, name: filenameHuman as String) 

     } 

     NSLog("Currently cached images: %@",WKInterfaceDevice.currentDevice().cachedImages) 

也是存儲器分配和存儲器泄漏的屏幕截圖是:

enter image description here

請幫幫忙,先謝謝了。

+0

這不會解決它,但可能會有所幫助https://developer.apple.com/library/ios/qa/QA1894/_index.html – Frans

+0

你有沒有深究過這一點。我有完全相同的問題。每次調用WKInterfaceDevice.currentDevice()。addCachedImage()時內存都會上升,直到AwakeWithContext完成後纔會釋放內存。 –

+0

@BrettHannah我在AwakeWithContext完成後使用上面的代碼,當我回彈時,內存不被釋放。 ? –

回答

0

在你的循環內部嘗試自動釋放圖像使用的內存,因爲你不想等待autorelease稍後在方法返回時發生。

for (var i : Int = 1; i<26; i++) { 
    autoreleasepool { 
     /* code to cache images */ 
    } 
} 
+0

我已經這樣做了,但沒有太多幫助,它並沒有減少內存。 –

+0

有趣。接下來我要做的是嘗試確定是罪魁禍首的代碼行。從循環底部開始,將每行註釋掉並運行應用程序。執行它直到它能夠運行。你創建'UIImage'的兩行應該沒問題,因爲你有autoreleasepool,但是可能有些事情我沒有看到。 –

1
  • 是否有任何圖片的實際動畫(這將佔用更多的空間)?
  • 收集每次調用addCachedImage()的返回值。假意味着它不能被添加 - 你需要檢查它,它可能會提供有關特定問題圖像的線索。
  • 在調用任何東西之前,嘗試清空緩存removeAllCachedImages。這意味着您將使用內存池清理之前的緩存交互。

我認爲你的問題不是泄漏,我認爲你的問題是過度保留的分配。因此,使用Allocations工具(保留計數跟蹤)來查看分配了多少內存(虛擬機分配)以及有多少實體持有這些內存(保留計數)。

相關問題