2016-10-11 52 views
0

我在我的主包中使用屬性列表來存儲關於關卡和玩家的信息。第一次啓動應用程序時,pList會被複制到手機中,然後根據需要從本地副本訪問信息。我正在運行Instruments中的Leaks,我一直遇到內存泄漏,我認爲這與創建存儲在pList中的字典和其他數據類型有關。內存泄漏使用屬性列表/ NSMutableDictionary

這裏就是字典創建 - 尋找到plist中的路徑後:

if fileManager.fileExists(atPath: path.path) { 

    if let dictionaryForPlist = NSMutableDictionary(contentsOf: path) { 

     return(dictionaryForPlist) 
    } 
    else { 
     print("pList not found") 
    } 

let levelInstanceData = LevelData() //this class searches the main bundle for the plist and stores the pList as an NSMutableDictionary 
let currentLevel = levelInstanceData.localDataFile["Level1"] as! Int //localDataFile is the NSMutableDictionary storing the information 
let levelName = levelInstanceData.localDataFile["Level1Name"] as! String 

我用力每一塊數據轉換爲正確的數據類型,並用它在整個水平。

這裏是儀器泄漏對象的屏幕截圖。有沒有其他人有這個問題,或有任何想法如何阻止泄漏?

+0

有關於蘋果SpriteKit論壇內存泄漏的幾個問題。這是我用字典看到的第一個。你可能很幸運。第一個找到這個。 SK和錯誤.... – Confused

回答

1

提供所有泄漏的對象不是太有幫助。你需要做的是查看與每個泄漏對象相關的調用樹。這會告訴你泄漏源於哪裏。從那裏你可以開始推斷需要做些什麼來補救它。

你應該閱讀這個。它是過時的,但它討論了調用樹。

https://www.raywenderlich.com/2696/instruments-tutorial-for-ios-how-to-debug-memory-leaks

+0

謝謝,這是有幫助的,但我不知道有什麼我可以做的關於這些泄漏 - 其中很多來自'如果let dictionaryForPlist = NSMutableDictionary(contentsOf:路徑){'還有一些是從追加到數組並設置playSoundFileNamed動作。 – claassenApps

+0

有人仍然堅持'if let dictionaryForPlist = NSMutableDictionary(contentsOf:path)'創建的字典。作爲測試,您可以讓調用者將方法複製到字典中。無論如何,沒有呼叫樹,這都是猜測。您將需要更好地瞭解保留對象的工作方式以及如何推斷這一點。這是你的代碼庫,所以外部看不到你所看到的。 –

+0

感謝您的評論。我開始着手確定保留週期並刪除了很多,但顯然不是全部。我沒有看到保留路徑,但我會再看一遍。我還會嘗試抓取其中一個呼叫樹的截圖並將其發佈在問題中。 – claassenApps