【问题标题】:iOS app keep increasing the memory?(Memory Crash) DidReceiveMemoryWarningiOS 应用程序不断增加内存?(Memory Crash) DidReceiveMemoryWarning
【发布时间】:2014-09-11 04:09:22
【问题描述】:

我已经开发了使用MKMapView,MoviePlayer,Recording Videos,Downloading the Videos and Uploading videos at Amazone Server的应用程序。

现在,当我用MKMapview 窗口打开屏幕时,它每次只会将内存增加到 10 MB,而当我从该屏幕返回时,它只会减少 5 MB。与MPMoviePlayer 相同。

我的上传线程在后台模式下连续运行。(它会检查一些 plist 文件,如果 plist 文件有一些条目,它将开始在后台进程中上传视频,完成后它将停止线程 1 分钟,然后再次为上述过程启动它)但我将对象保留为 __weak 属性,所以这不是使用我的内存的原因。

我怀疑 MKMapview 和 MPMoviewPlayer 使用高内存而不是重新分配它。

在我的应用程序中,我有要从服务器播放的视频,在播放时我需要从服务器下载相同的视频。

意味着用户也可以看到地图。

现在我的问题可能是我的应用程序使用了太多东西,所以在运行它时内存达到 218 MB,如果我连续使用它并非常粗略地访问它,应用程序就会崩溃。

所以任何人都可以建议我如何防止这种内存不足崩溃。我还检查了内存泄漏。但我还没有发现很多重要的泄漏。

我想的是UIImagePickerController,MkMapview,MPMoviewplayer,Download,upload Videos这种功能让我的应用程序吃掉了更多的记忆。 当我在我的应用程序中访问屏幕时,手机内存不断增加......

【问题讨论】:

  • 使用 Instruments 看看有什么在使用内存。您可能有几个引用循环阻止对象被释放。

标签: ios objective-c memory memory-leaks out-of-memory


【解决方案1】:

我要检查的第一件事是你是否创建了很多自动释放对象,并且不要耗尽自动释放池。如果您没有使用@autoreleasepool {...} 设置自己的自动释放池,则默认的自动释放池只会在应用返回主事件循环时清空。此外,任何后台线程都应该安装一个自动释放池。请查收the docs

【讨论】:

  • 我在我的项目中启用了 ARC
  • @BhavikKama:ARC 并不意味着您不必考虑内存消耗!
  • 所以我需要在后台线程或使用更多内存的每个方法中使用@autoreleasepool {...}?
  • 文档说“如果您的应用程序或线程是长期存在的并且可能会生成大量自动释放的对象,您应该使用自动释放池块......;否则,自动释放的对象会累积并且您的内存占用会增加。”这与 ARC 无关。在很多情况下都会创建自动释放对象,例如通过使用 [NSArray array] 或使用 getter。如果您经常在循环中执行此操作,那么为循环体设置一个自动释放池可能是有意义的。
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多