面积

2017-06-14 68 views
0

我已经创建了一个应用程序有12个视图控制器和它得到了很多图形的iOS应用程序的内存使用(图像文件)面积

当我启动的应用程序,我注意到内存上涨,因为我通过移动视图控制器。一旦我已经完成了所有的控制器移动内存530MB

所以我的问题是: -

一),这是一个很大的内存来使用 二)我应该担心 c)我如何从内存中删除视图控制器,当我导航回合..例如我有一个视图控制器上博但是一旦有人点击跳过或开始,我会继续看下一个视图控制器,因此理论上它不需要再加载。

想法?

我运行在iPhone 7 Plus上,它具有3Gbm,但希望能够在iPhone SE之后的其他手机型号上运行该应用程序。然而,我注意到内存配置文件是大约50%没有iPhone本身,而是假设那是因为它不加载X3图像按加电话

回答

1

一),这是一个很大的内存来使用

很多是相对术语,530Mb是否完全取决于应用程序在做什么以及它是什么类型的应用程序!如果它的游戏具有丰富的图形功能,我不会受到太多的困扰,但如果它是一个简单的实用程序,我会担心的!

二)我应该担心

内存得到累积/为用户负载增加应用程序的各种屏幕是一种非常常见的场景。如果它不断增加,永远不会下降,你应该感到困扰。每次VC加载时都可能会加载,使用它的图形很大,或者可能会分配大量变量并消耗大量内存来执行其功能。这很公平。但是,一旦用户从应用程序导航堆栈中弹出VC,应该返回由VC分配的所有内存,并且应用程序消耗的内存总量应该减少。理想的记忆足迹看起来就像是一个达到高峰的波形,一旦VC弹出,它就会下降。如果那没有发生,你有麻烦了:)

三)如何从内存中删除视图控制器为我导航轮

  1. 使用适当的导航技术。除非实际需要将VC实例保留在内存中,否则不要将VC推到导航控制器堆栈。所有推到导航堆栈的VC都将继续保留在内存中,直到用户杀死应用程序或者iOS决定在接收到内存警告时关闭应用程序为止。

  2. 在每个VC中写入deinit/dealloc,并确保每次用户弹出VC时都会调用该按钮,方法是按下按钮(如果按下按钮),或者如果VC以模式形式呈现则关闭VC。确保每个VC的deinit被调用是确保VC不会占用任何不必要的内存的最佳方式。

  3. 确保您的VC中没有代码会导致保留周期并将对象永久保留在内存中。例子:如果你的VC声明了一个块并且拥有对块的强引用,并且你传递了自己来阻止你的块,那么自己永远不会被释放。典型的保留周期例子。确保你的代码不会产生这样的死锁

  4. 永远不要坚持任何东西强烈使用strong/retain,除非它是必要的。

  5. 使用工具来查找每个对象的内存泄漏和引用计数,以确保在应用程序中没有内存泄漏。

+0

@ sandeep-bhandaripp感谢您的信息...几个进一步的问题..一位新手,但你是什么意思适当的导航技术?我创建了一个单一视图应用程序,并在它们之间添加了各种VC和seque,这是错误的吗? 也读了关于ARC,我假设VC会放手,但我使用SWIFT 3,所以你如何决定VC? – user2596590

+0

@ user2596590:如果您使用push/show segue,则View Controller会被推入导航堆栈。直到用户通过点击返回按钮或杀死应用程序来弹出ViewController时,推送到导航堆栈的视图控制器才会被释放。所以你应该使用push,如果你真的想要VC坚持,并允许用户回到屏幕上回来。如果你推入loginVC,那么loginVC也会被保留,但登录是一次性使用,你不希望用户通过点击回到这个屏幕,使用push将使得LoginVC保存在内存中 –

+0

因此,你所有的VC不希望它坚持你使用模态segue并解雇它以摆脱它,一旦使用这将不会使VC保存在内存中。类似地,每当用户点击推送的VC上的后退按钮并从导航堆栈弹出VC时,VC的deist/dealloc被调用。确保它被调用。如果它没有被调用,那意味着你的VC被某些不允许它释放的东西所控制。因此记忆不会下降。 –