我最近一直在研究一个大项目,有很多不同的观点。我遇到了一些相当大的内存泄漏,不得不挖掘一些答案。我没有看到关于这个主题的任何一般类别,并且想要提出一些想法。如果这些是显而易见的,我道歉。
尽可能在例程或@Interface部分中创建指针。永远不要在@Implementation区域声明它们。当视图消失时,@ Implementation中的声明不会被释放。虽然不是全球性的,但它们也存在于观点的生命之外。
Images.xcassets只能用于非常小的图像。它出现在这里的图像,在使用时加载,但在应用程序的生命周期内保留在内存中。我在这里确定了一些屏幕尺寸的图像,一旦使用,它们就留在了记忆中。对于较大的图像,将PNG文件添加到“支持文件”区域,然后将其加载到UIImage中。内存使用率要低很多,一旦加载到视图中,UIImage指针就可以设置为nil。
定时器必须无效且任何指针设置为nil或视图不会解除分配,并且与视图关联的所有内存都将保持驻留状态。 (这在网站上有很好的记录)
假设上述处理得当,模型segue和Unwinds工作得很好。如果在从视图中展开时未释放内存,请查找仍引用视图中视图或结构的一部分的指针。
如果使用XCode为新游戏项目构建的SKScene,请注意第1项。 “#'场景'变量在GameViewController的@Implementation部分中声明。如果将其作为定期视图运行,则每次加载视图时将丢失大约10 MB。
观看图片的大小。我有几张3500x3100的图像,比屏幕所需的图像大得多。确保您的图像尺寸与预期的屏幕尺寸相匹配且不大。您需要加载图像并将其放在屏幕上,因此在某些区域操作系统会同时拥有一些图像副本,以便显示它。
从我的主视图中,我有指向@Interface中定义的子视图的指针。这也不好。那些指针附近,所以子视图不会在不使用时解除分配。将它保持在prepareForSegue例程的本地区域是更清晰的,但是如果你以后确实需要它们,请确保在完成视图后将它们设置为nil。
再次,我为明显的道歉,但它帮助我在一个位置得到这一切。有很多工具可用于观察内存,例如乐器,但最容易观看的只是调试中的内存级别。现有的子视图应该会让您回到原来的同一级别。如果每次打开子视图时都获得,请查找仍然有效的指针。