适用于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开发人员应以他们认为容易的任何方式来注意保留周期。 如果不处理这些保留周期,则您的应用程序将遇到内存问题,因此最好继续删除它们。
如果您找到其他更有趣的方法来达到相同的效果,请分享。
编码愉快!
- 我怎样才能修改heightForRowAtIndexPath,使其调整高度的TextView中,但也保持最小的高度,当textview为空?
- UITableView干扰状态栏
- iOS扩展 – 致命exception:com.firebase.core默认的应用程序已被configuration
- 如何构buildFFMpeg作为iOS框架
- 将datestring转换为Int Swift
- 阻止执行dispatch_after()后台任务
- iOSCon 2019
- 不能在Mavericks下使用我自己的kestore和xcodebuild
- 如何在Swift中使用NSURLSession downloadTask按顺序下载多个文件