适用于iOS的高级Viper架构,无保留周期。

如今,大型团队的开发人员花费大量时间使用和维护其代码库,而该体系结构提供了开发周期的所有基本要素。 作为开发人员,设计我们的代码非常重要,这样每一部分都易于识别,具有特定的明显目的,并以逻辑方式与其他部分组合在一起。

在本文中,我将介绍一种方法,该方法如何在我们的iOS项目中准确使用VIPER架构,而又不会使内存堆积如山。 本文不是VIPER体系结构的初学者,而是对于使用过该体系结构且可能难以确定几个内存问题的人员的。

在继续之前,请在GitHub上克隆项目。

在该项目中,有两个视图控制器,它们将非常容易且清晰地演示主要问题。 Home View Controller是主导航控制器和推入Home VC的帐户视图控制器的根视图控制器。

克隆上述存储库后,签出“ Without_VIPER”分支。

该分支显示了此演示项目的主要目标。 一个导航堆栈上有两个屏幕。 按下“帐户”按钮后,“帐户VC”将被推送到导航控制器。
在控制台上,您将看到两个视图控制器均已加载到内存中。 按下导航栏上的后退按钮后,您将看到帐户视图控制器已取消初始化。

因此,这是我们项目的基础。 弹出视图控制器后,应将其取消初始化,并释放内存。

现在,检出同一存储库的“ Basic_VIPER”分支。

现在,两个视图控制器都以以下方式遵循VIPER架构方法。

运行该应用程序后,您会看到在Home VC上所有通信都已完成。 它只是在模拟VIPER体系结构的基本流程。
按下帐户按钮后,帐户VC将被推送到导航控制器,并且将一个全新的对象块添加到内存中。 现在按下后退按钮,您将看到Account VC尚未从内存中取消初始化。

每次您按下Home VC上的“帐户”按钮时,都会不断将大量对象添加到内存中,这些对象将相互保持引用并被保留。

在只有两个视图控制器的此类项目中,如果未在适当的完整项目中处理此内存管理,则您的应用程序可能会遇到许多悬空指针。

我们的任务是删除上述保留周期。

现在,检出同一存储库的“ Advance_VIPER”分支。

我们的主要重点是从项目中删除上述保留周期。 可以有很多方法来执行此操作,但是我将遵循所描述的方法。

我将从我们的P(演示者)那里获得一个V(视图控制器)的弱引用,同样,我将从我们的I(交互器)那里获得一个我们的P(演示者)的弱参考。

演示者的实现将通过以下方式进行。

当取消帐户演示者的初始化时,我们将对交互者的引用设为nil,并且作为演示者,交互者引用很弱,因此将没有任何保留周期。 同样,将为View和Presenter保留周期。

运行项目并弹出Account VC后,您将看到所有对象现在都已从内存中取消初始化,并且内存已释放。

本文没有提出实现VIPER体系结构的正确方法,只是表明在实施VIPER时,iOS开发人员应以他们认为容易的任何方式来注意保留周期。 如果不处理这些保留周期,则您的应用程序将遇到内存问题,因此最好继续删除它们。

如果您找到其他更有趣的方法来达到相同的效果,请分享。

编码愉快!