【问题标题】:Watch kit App : Terminated due to memory error手表套件应用程序:由于内存错误而终止
【发布时间】:2015-07-31 05:17:43
【问题描述】:

您好,我正在开发一个应用程序,我需要在其中缓存 50 张图片(所有图片的大小为 2.5 mb),它正在缓存图片,但由于应用程序崩溃,Apple Watch 应用程序的内存也增加了 10 mb。

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)

还有内存分配和内存泄漏的截图:

请帮忙,在此先感谢。

【问题讨论】:

  • 这不会解决问题,但可能会有所帮助developer.apple.com/library/ios/qa/QA1894/_index.html
  • 你有没有搞清楚这个。我有完全相同的问题。每次调用 WKInterfaceDevice.currentDevice().addCachedImage() 时内存都会增加,直到 AwakeWithContext 完成后才会释放。
  • @BrettHannah 我在 AwakeWithContext 完成后使用上面的代码,当我弹回来时,内存没有释放。 ?

标签: ios swift watchkit


【解决方案1】:

在您的循环中尝试自动释放图像使用的内存,因为您不想等待稍后在方法返回时发生自动释放。

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

【讨论】:

  • 我已经这样做了,但没有太大帮助,也没有减少内存。
  • 有趣。接下来我要做的就是尝试找出罪魁祸首的代码行。从循环底部开始,注释掉每一行并运行应用程序。重复一遍,直到它能够运行。您创建UIImage 的两行应该没问题,因为您有自动释放池,但也许有一些我没有看到的事情发生。
【解决方案2】:
  • 您的任何图像实际上是动画(会占用更多空间)吗?
  • 收集每次调用 addCachedImage() 的返回值。 False 表示无法添加 - 您需要检查它,它可能会提供有关特定问题图像的线索。
  • 在调用任何东西之前,请尝试清空缓存,removeAllCachedImages。这意味着您将不再使用以前的缓存交互来耗尽内存池。

我认为您的问题不是泄漏,我认为您的问题是过度保留的分配。因此,请使用分配工具(带有保留计数跟踪)查看分配了多少内存(VM 分配)以及有多少实体保留了这些内存(保留计数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2015-07-10
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多