【问题标题】:Memory Leak using Property List / NSMutableDictionary使用属性列表 / NSMutableDictionary 的内存泄漏
【发布时间】:2017-02-19 13:15:28
【问题描述】:

我在我的主包中使用一个属性列表来存储关卡和玩家的信息。第一次启动应用程序时,pList 会被复制到手机上,然后我会根据需要从该本地副本中访问信息。我在 Instruments 中运行 Leaks,并且不断遇到内存泄漏,我认为这与创建字典和存储在 pList 中的其他数据类型有关。

这里是创建字典的地方 - 在找到 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

我强制将每条数据转换为正确的数据类型,并在整个关卡中使用它。

这是 Instruments 中泄漏对象的屏幕截图。有没有其他人遇到过这个问题或有任何想法如何阻止泄漏?

【问题讨论】:

  • Apple SpriteKit 论坛上有几个关于内存泄漏的问题。这是我第一次看到字典。你可能很幸运。第一个找到这个。 SK 和错误....

标签: ios swift memory-leaks sprite-kit property-list


【解决方案1】:

提供所有泄漏的对象并没有太大帮助。您需要做的是查看与每个泄漏对象相关的调用树。这将向您展示代码中泄漏的来源。从那里你可以开始推断需要做些什么来补救它。

您应该阅读此内容。它已经过时了,但它讨论了调用树。

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

【讨论】:

  • 谢谢,这很有帮助,但我不确定我能对其中一些泄漏做些什么——其中很多来自if let dictionaryForPlist = NSMutableDictionary(contentsOf: path) {,还有一些来自附加到数组和设置playSoundFileNamed 动作。
  • 有人仍然持有if let dictionaryForPlist = NSMutableDictionary(contentsOf: path)创建的字典。作为测试,您可以让获取 plist 的方法的调用者复制字典。无论如何,没有调用树,这都是猜测。您将需要更好地了解保留对象的工作原理以及如何推断这一点。它是您的代码库,因此外部无法看到您看到的内容。
  • 感谢您的评论。我开始掌握识别保留周期的窍门,并删除了很多,但显然不是全部。我没有看到保留路径,但我会再次调查。我还将尝试抓取其中一个调用树的屏幕截图并将其发布在问题中。
  • 此问题的更新 - 内存泄漏发生在运行 iOS10 的设备上,而不是运行 iOS9 的设备上。这应该意味着导致内存泄漏的不是我的代码,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多