2016-10-11 61 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