Swift中的内存问题

对于开发本机iOS应用程序的任何人来说,管理内存都是重要且必要的,如果您使用的是Apple的新编程语言Swift,则仍然如此。 我在最近的项目中遇到并解决了一些内存问题。

一点历史

内存是指在设备上存储信息所涉及的所有硬件。 您的iPhone有两种主要的数据存储方式:1.磁盘2.随机存取存储器(RAM)。 在iPhone上运行应用程序时,包含所有可执行指令的文件将被加载到RAM中。 同时,系统将占用一部分RAM,称为堆。 在该目录下,我们的类的所有实例都将在应用程序运行时运行。 当我们谈论内存管理时,我们指的是管理堆内存的过程。 这意味着管理堆上对象的生命周期,并确保在不再需要这些对象时将其释放,以便可以重用内存。 在Objective-C中,除了Int,CGRect等原语外,所有内容都是对象,因此将在堆上分配。 在Swift中,引用类型是在堆上分配的,而值类型不是。 管理堆内存非常重要,因为对象可能很大,而我们的应用程序只能从系统中获取这么多的内存。 内存不足会导致iOS应用运行缓慢,并最终导致应用崩溃。 尽管如今,由于我们的设备变得越来越强大,看到RAM过载变得越来越少了,但成为一个良好的内存公民总是很重要的。

Objective-C从未像Java这样的语言实现垃圾回收。 那时,我们需要进一步了解内存处理。 理解分配,复制,保留的含义以及如何平衡这些操作与相反的操作(如发布)至关重要。 基本规则是:无论何时创建对象,您都拥有它并负责释放它。

为什么泄漏可能很危险?

想象一下在init内创建通知时开始监听的对象。 它对此做出反应,将内容保存到数据库,播放视频或将事件发布到分析引擎。 由于需要平衡对象,因此我们在释放对象时在deinit内停止监听通知。

这不仅会增加应用程序的内存占用 ,而且还会带来不必要的副作用崩溃。

如果这些物体泄漏会怎样?

它永远不会消亡,永远不会停止收听通知。 每次发布通知时,对象都会对此做出反应。 如果用户重复执行再次创建对象的操作,则将存在多个实例。 所有这些实例都响应通知并相互介入,在这种情况下, 崩溃将是最好的事情🙂

多个泄漏的对象对应用程序通知做出反应,更改了数据库,UI,破坏了应用程序的整个状态

在Swift中 当一个对象强烈引用另一个对象时,它会将其保存在内存中。 当我说对象时,基本上就是引用类型,类。

结构和枚举是值类型。 无法仅使用值类型创建保留周期。 在捕获和存储值类型(结构和枚举)时,没有诸如引用之类的东西。 尽管值可以保存对对象的引用,但值是复制而不是引用的。

当一个对象与第二个对象具有强关联时,它便拥有它。 第二个对象将保持活动状态,直到被释放。 这被称为S trong参考 。 只有将属性设置为nil时,第二个对象才会被销毁。

视图控制器泄漏

视图控制器或自定义视图在加载视图时可能立即开始泄漏。 之后,可能会发生一百万件事,但是通过此简单的测试,您可以确保viewDidLoad不会泄漏。

反初始化

一种方法是确保调用`deinit`。 当Deinit被调用时
指向对象的最后一个指针将被删除,并且内存
分配给它的将被清除。 使用打印或调试模式检查是否
从每个视图控制器中调用`deinit`; 否则,如果您将
将断点转换为空的deinit方法,编译器将对其进行优化
即使`deinit`,此代码和您的断点也不会被命中
会被称为。