一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种iOS项目内存泄露预警方法及系统与流程

2022-11-28 12:57:48 来源:中国专利 TAG:

一种ios项目内存泄露预警方法及系统
技术领域
1.本发明涉及互联网技术领域,具体的,本发明涉及一种ios项目内存泄露预警方法及系统。


背景技术:

2.内存泄漏(memory leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂,开发人员在程序实现的过程中处理的变量也大量增加,因此需有效进行内存分配和释放,防止内存泄漏的问题积累的越来越多。
3.目前在做ios项目开发时,没有自动的内存泄漏预警的功能,如果需要检测内存泄漏,需要用工具进行检测,但这种情况往往是在明确知道可能存在内存泄漏的情况下,才会去通过工具分析,不能在开发过程中就提前预警,不能在开发过程中将内存泄漏问题进行解决。


技术实现要素:

4.为了克服现有技术的不足,本发明提供了一种ios项目内存泄露预警方法及系统,以解决上述的技术问题。
5.本发明解决其技术问题所采用的技术方法是:一种ios项目内存泄露预警方法,其改进之处在于:包括以下的步骤:s1、创建基类nsobject的分类category文件nsobject methodswizzling,实现系统交互方法;s2、创建视图控制器uiviewcontroller的分类category文件uiviewcontroller leaks,实现内存泄漏检测调用的方法al_viewdiddisappear;s3、获取当前的视图控制器方法al_rootparentviewcontroller;s4、实现检测内存泄漏方法al_checkdeallocationafterdelay;s5、将封装和实现好的工具类文件uiviewcontroller leaks和nsobject methodswizzling拷贝到ios工程项目,实现内存泄漏预警。
6.在上述方法中,所述步骤s1,包括以下的步骤:
7.s11、通过开发工具xcode编辑器,右键选择新建文件操作newfile新建文件,在弹出的文件类型选项中选择文件类型object-c file;
8.s12、在弹出的弹窗选项中编辑,选择文件类型file type为category,选择需要创建分类的类名类型class为nsobject,并将创建的分类category文件file命名为methodswizzling,点击完成可得到基类nsobject的分类文件nsobject methodswizzling;
9.s13、在所述的基类nsobject分类文件nsobject methodswizzling里的声明@interfacensobject(methodswizzling)@end区间完成基类nsobject分类methodswizzling的声明;
10.s14、在声明interface里定义交换方法 (void)sy_swizzleinstanceselector:(sel)origselectorswizzleselector:(sel)swizzleselector,提供给使用放调用;
11.s15、在基类nsobject分类文件nsobject methodswizzling文件里完成实现的定义@implementationnsobject(methodswizzling)@end,完成对基类nsobject分类methodswizzling的实现区间定义;
12.s16、通过模块引入方法#import引入nsobject的运行时库#import
13.《objc/runtime.h》;
14.s17、在基类nsobject分类文件nsobject methodswizzling的实现区间@implementation里通过运行时runtime实现交换方法 (void)sy_swizzleinstanceselector:(sel)origselectorswizzleselector:(sel)swizzleselector;
15.s18、通过运行时runtime对所述交换方法的实现,通过类对象查找方法class_getinstancemethod,通过传进来的原始方法选择器origselector得到原始方法的方法结构体method,命名为origmethod,和传进来的要进行交换的方法名swizzleselector,得到要进行交换的方法的方法结构体method,命名为swizzlemethod;
16.s19、通过运行时动态添加方法class_addmethod添加方法,若返回假值false,则表示被替换方已经存在,此时通过运行时库提供的交换方法method_exchangeimplementations将获取到的需要被替换的方法origmethod和希望替换的实现方法swizzlemethod进行交换即可,若返回真值true,则表示被替换的方法不存在,此时需要通过替换方法class_replacemethod(self,swizzleselector,method_getimplementation(origmethod),method_gettypeencoding(origmethod)),将获取到的原始方法origmethod的指针和需要替换的新函数指针进行交换。
17.在上述方法中,所述步骤s18中,类对象查找方法class_getinstancemethod,首先在类对象的methods里查找该方法,若没有找到,则在父类super class里进行查找。
18.在上述方法中,所述步骤s2,包括以下的步骤:
19.s21、通过开发工具xcode编辑器,右键选择新建文件操作new file新建文件,在弹出的文件类型选项中选择文件类型object-c file;
20.s22、在弹出的弹窗选项中编辑,选择文件类型file type为category,选择需要创建分类的类名类型class为uiviewcontroller,并将创建的分类category文件file命名为leaks,点击完成,得到uiviewcontroller的分类文件uiviewcontroller leaks;
21.s23、通过引入方法#import"nsobject methodswizzling"将所述的分类文件nsobject methodswizzling引入到uiviewcontroller leaks里使用;
22.s24、定义检测是否有内存泄漏发现方法(void)al_checkdeallocationafterdelay:(nstimeinterval)delay;
23.s25、实现自定义方法(void)al_viewdiddisappear:(bool)animated和控制器生命周期方法中表示控制器消失的方法(void)viewdiddisappear:(bool)animated进行交换,并且在所述自定义方法al_viewdiddisappear里调用所述的内存泄漏发现方法(void)al_checkdeallocationafterdelay:(nstimeinterval)delay;
24.s26、在uiviewcontroller的初始化加载方法load方法里,通过宏debug判断当前
环境是开发环境还是发布环境;
25.s27、在开发执行代码区间里调用所述的系统交互方法,通过调用该方法[selfsy_swizzleinstanceselector:@selector(viewdiddisappear:)swizzleselector:@selector(al_viewdiddisappear:)],将视图控制器uiviewcontroller生命周期方法中表示视图已经消失的方法viewdiddisappear替换成自定义的用以实现内存泄漏检测调用的方法al_viewdiddisappear。
[0026]
在上述方法中,所述步骤s26中,判断当前环境的判断方法为#ifdebug#endif,在#ifdebug和#endif之间的即为开发环境执行的代码。
[0027]
在上述方法中,所述步骤s3,包括以下的步骤:
[0028]
s31、定义和实现获取当前展示的视图控制器uiviewcontroller方法al_rootparentviewcontroller;
[0029]
s32、通过循环语句while循环,循环遍历实现获取当前展示的视图控制器,包括初始化视图控制器root,并先指向当前控制器uiviewcontroller*root=self;
[0030]
s33、通过判断语句判断当前root的父视图控制器是否存在,若存在,则将其值赋值给root,并跳转至步骤s32,继续while循环,直到循环结束,将视图控制器root的值通过获取当前视图控制器方法al_rootparentviewcontroller返回给调用方。
[0031]
在上述方法中,所述步骤s4,包括以下的步骤:
[0032]
s41、通过所述的al_rootparentviewcontroller方法,获取当前正在展示的视图控制器uiviewcontroller定义为root;
[0033]
s42、获取视图控制器root,判断其是否来源于父视图控制器的属性ismovingfromparentviewcontroller的值是否为true,若为true,则表示当前视图控制器root正在从它的父视图控制器中移除;或者,获取视图控制器root是否消失属性isbeingdismissed的值是否为true,来判断当前视图控制器root是否被模态推送出来;
[0034]
s43、通过获取类名方法nsstringfromclass([self class])获取self所在的类的名称描述;
[0035]
s44、判断所述的self类的名称描述是否为控制器uicompatibilityinputviewcontroller类型,若相同,则为真值true;
[0036]
s45、判断所述的self类的名称描述是否为获取选择图片和视频的控制器uiimagepickercontroller,若相同,则为真值true;
[0037]
s46、当所述步骤s42、s44和s45中的条件判断不均为真值true时,则不存在内存泄漏;
[0038]
s47、当所述步骤s42、s44和s45中的条件判断均为真值true时,通过将弱引用关键字__weak定义weakself,将weakself指向当前控制器的self,实现为__weaktypeof(self)weakself=self;
[0039]
s48、通过调用延时方法dispatch_after(dispatch_time(dispatch_time_now,(int64_t)(delay*nsec_per_sec)),dispatch_get_main_queue(),在延时时间秒数delay后执行weakself的判断,如果此时weakself的值为空值nil,则表示已正常释放,此时符合ios的自动内存管理机制,不存在内存泄漏且不需要特殊处理,如果此时weakself的值不为空值nil,则表示当前weakself没有被释放,即当前控制器self对应的内存没有被释放掉,
不符合ios的自动内存管理机制,此时当前的视图控制器存在导致内存泄漏的代码;
[0040]
s49、创建弹框控制器uialertcontroller,将当前存在内存泄漏的视图控制器uiviewcontroller的名称描述弹框提示。
[0041]
在上述方法中,所述步骤s5,包括以下的步骤:
[0042]
s51、将封装和实现好的工具类文件uiviewcontroller leaks和nsobject methodswizzling拷贝到ios工程项目中;
[0043]
s52、在ios工程项目的视图控制器基类文件中,通过引入方法#import"uiviewcontroller leaks.h"将该工具类文件uiviewcontroller leaks引入;
[0044]
s53、视图控制器在加载时自动执行加载方法 (void)load方法,在该加载方法中通过宏debug判断当前app运行的环境,若为开发模式下,则执行交换方法[selfsy_swizzleinstanceselector:@selector(viewdiddisappear:)swizzleselector:@selector(al_viewdiddisappear:)];
[0045]
s54、当用户离开当前视图控制器时,执行视图控制器的离开的生命周期方法viewdiddisappear,执行al_viewdiddisappear方法;
[0046]
s55、在al_viewdiddisappear方法中,调用所述的内存泄漏检测方法al_checkdeallocationafterdelay,在存在内存泄漏时进行提示。
[0047]
本发明还提供了ios项目内存泄露预警系统,通过所述的ios项目内存泄露预警方法,实现ios项目内存泄漏预警。
[0048]
本发明的有益效果是:通过object-c的运行时runtime机制,运行时将系统方法和自定义方法进行交换,在自定义方法里实现内存泄漏的检测和预警,当视图控制器存在内存泄漏时进行预警提示,实现了在开发的过程中就能发现内存泄漏存在的地方,然后对内存泄漏问题进行排查解决,避免积累越来越多导致应用闪退;通过在捕获到这个界面销毁依然存在未销毁对象之后,让其响应一个方法,通过这个方法触发预警提示,预警提示会提示出现了内存泄漏的视图控制器。
附图说明
[0049]
附图1为本发明的一种ios项目内存泄露预警方法的流程图。
具体实施方式
[0050]
下面结合附图和实施例对本发明进一步说明。
[0051]
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整地描述,以充分地理解本发明的目的、特征和效果。显然,所描述的实施例只是本发明的一部分实施例,而不是全部实施例,基于本发明的实施例,本领域的技术人员在不付出创造性劳动的前提下所获得的其他实施例,均属于本发明保护的范围。另外,专利中涉及到的所有联接/连接关系,并非单指构件直接相接,而是指可根据具体实施情况,通过添加或减少联接辅件,来组成更优的联接结构。本发明创造中的各个技术特征,在不互相矛盾冲突的前提下可以交互组合。
[0052]
参照图1所示,本发明提供了一种ios项目内存泄露预警方法,包括以下s1-s4的步骤:
[0053]
s1、创建基类nsobject的分类category文件nsobject methodswizzling,实现系统交互方法;
[0054]
具体的,步骤s1,包括以下的步骤:
[0055]
s11、通过开发工具xcode编辑器,右键选择新建文件操作new file新建文件,在弹出的文件类型选项中选择文件类型object-c file;
[0056]
s12、在弹出的弹窗选项中编辑,选择文件类型file type为category,选择需要创建分类的类名类型class为nsobject,并将创建的分类category文件file命名为methodswizzling,点击完成可得到基类nsobject的分类文件nsobject methodswizzling;
[0057]
s13、在所述的基类nsobject分类文件nsobject methodswizzling里的声明@interface nsobject(methodswizzling)@end区间完成基类nsobject分类methodswizzling的声明;
[0058]
s14、在声明interface里定义交换方法 (void)sy_swizzleinstanceselector:(sel)origselectorswizzleselector:(sel)swizzleselector,用于提供给使用放调用;
[0059]
s15、在基类nsobject分类文件nsobject methodswizzling文件里完成实现的定义@implementationnsobject(methodswizzling)@end,完成对基类nsobject分类methodswizzling的实现区间定义;
[0060]
s16、通过模块引入方法#import引入nsobject的运行时库#import
[0061]
《objc/runtime.h》;
[0062]
s17、在基类nsobject分类文件nsobject methodswizzling的实现区间@implementation里通过运行时runtime实现交换方法 (void)sy_swizzleinstanceselector:(sel)origselectorswizzleselector:(sel)swizzleselector;
[0063]
s18、通过运行时runtime对所述的步骤s14中的交换方法的实现,通过类对象查找方法class_getinstancemethod,该类对象查找方法class_getinstancemethod首先在类对象的methods里查找该方法,若没有找到,则在父类superclass里进行查找,最终通过传进来的原始方法选择器origselector得到原始方法的方法结构体method,命名为origmethod,和传进来的要进行交换的方法名swizzleselector,得到要进行交换的方法的方法结构体method,命名为swizzlemethod;
[0064]
s19、通过运行时动态添加方法class_addmethod添加方法,若返回假值false,则表示被替换方已经存在,此时通过运行时库提供的交换方法method_exchangeimplementations将获取到的需要被替换的方法origmethod和希望替换的实现方法swizzlemethod进行交换即可,若返回真值true,则表示被替换的方法不存在,此时需要通过替换方法class_replacemethod(self,swizzleselector,method_getimplementation(origmethod),method_gettypeencoding(origmethod)),将获取到的原始方法origmethod的指针和需要替换的新函数指针进行交换,从而实现系统方法和自定义方法的交换,达到实现系统交互方法的目的。
[0065]
s2、创建视图控制器uiviewcontroller的分类category文件uiviewcontroller leaks,实现内存泄漏检测调用的方法al_viewdiddisappear;
[0066]
具体的,所述步骤s2,包括以下的步骤:
[0067]
s21、通过开发工具xcode编辑器,右键选择新建文件操作newfile新建文件,在弹出的文件类型选项中选择文件类型object-cfile;
[0068]
s22、在弹出的弹窗选项中编辑,选择文件类型filetype为category,选择需要创建分类的类名类型class为uiviewcontroller,并将创建的分类category文件file命名为leaks,点击完成,得到uiviewcontroller的分类文件uiviewcontroller leaks;
[0069]
s23、通过引入方法#import"nsobject methodswizzling"将所述的分类文件nsobject methodswizzling引入到uiviewcontroller leaks里使用;
[0070]
s24、定义检测是否有内存泄漏发现方法(void)al_checkdeallocationafterdelay:(nstimeinterval)delay;
[0071]
s25、实现自定义方法(void)al_viewdiddisappear:(bool)animated和控制器生命周期方法中表示控制器消失的方法(void)viewdiddisappear:(bool)animated进行交换,并且在上述自定义方法al_viewdiddisappear里调用步骤s24中所述的内存泄漏发现方法(void)al_checkdeallocationafterdelay:(nstimeinterval)delay;
[0072]
s26、在uiviewcontroller的初始化加载方法load方法里,通过宏debug判断当前环境是开发环境还是发布环境;判断当前环境的判断方法为#ifdebug#endif,在#ifdebug和#endif之间的即为开发环境执行的代码。
[0073]
s27、在开发执行代码区间里调用所述的系统交互方法,通过调用该方法[selfsy_swizzleinstanceselector:@selector(viewdiddisappear:)swizzleselector:@selector(al_viewdiddisappear:)],将视图控制器uiviewcontroller生命周期方法中表示视图已经消失的方法viewdiddisappear替换成自定义的用以实现内存泄漏检测调用的方法al_viewdiddisappear。
[0074]
s3、获取当前的视图控制器方法al_rootparentviewcontroller;
[0075]
具体的,所述步骤s3,包括以下的步骤:
[0076]
s31、定义和实现获取当前展示的视图控制器uiviewcontroller方法al_rootparentviewcontroller;
[0077]
s32、通过循环语句while循环,循环遍历实现获取当前展示的视图控制器,包括初始化视图控制器root,并先指向当前控制器uiviewcontroller*root=self;
[0078]
s33、通过判断语句判断当前root的父视图控制器是否存在,若存在,则将其值赋值给root,并跳转至步骤s32,继续while循环,重复判断,直到循环结束,将视图控制器root的值通过获取当前视图控制器方法al_rootparentviewcontroller返回给调用方。
[0079]
s4、实现所述步骤s2中定义的检测内存泄漏方法al_checkdeallocationafterdelay;
[0080]
具体的,所述步骤s4,包括以下的步骤:
[0081]
s41、通过所述的步骤s3中的al_rootparentviewcontroller方法,获取当前正在展示的视图控制器uiviewcontroller定义为root;
[0082]
s42、获取视图控制器root,判断其是否来源于父视图控制器的属性ismovingfromparentviewcontroller的值是否为true,若为true,则表示当前视图控制器root正在从它的父视图控制器中移除;或者,获取视图控制器root是否消失属性isbeingdismissed的值是否为true,来判断当前视图控制器root是否被模态推送出来;
[0083]
s43、通过获取类名方法nsstringfromclass([selfclass])获取self所在的类的名称描述;
[0084]
s44、判断所述的步骤s43中的self类的名称描述是否为控制器uicompatibilityinputviewcontroller类型,若相同,则为真值true;
[0085]
s45、判断所述的步骤s43中的self类的名称描述是否为获取选择图片和视频的控制器uiimagepickercontroller,若相同,则为真值true;
[0086]
s46、当所述步骤s42、s44和s45中的条件判断不均为真值true时,则不存在内存泄漏;
[0087]
s47、当所述步骤s42、s44和s45中的条件判断均为真值true时,通过将弱引用关键字__weak定义weakself,将weakself指向当前控制器的self,实现为__weaktypeof(self)weakself=self;
[0088]
s48、通过调用延时方法dispatch_after(dispatch_time(dispatch_time_now,(int64_t)(delay*nsec_per_sec)),dispatch_get_main_queue(),在延时时间秒数delay后执行weakself的判断,如果此时weakself的值为空值nil,则表示已正常释放,此时符合ios的自动内存管理机制,不存在内存泄漏且不需要特殊处理,如果此时weakself的值不为空值nil,则表示当前weakself没有被释放,即当前控制器self对应的内存没有被释放掉,不符合ios的自动内存管理机制,此时当前的视图控制器存在导致内存泄漏的代码,需要进行告警给开发者和解决;
[0089]
s49、创建弹框控制器uialertcontroller,将当前存在内存泄漏的视图控制器uiviewcontroller的名称描述弹框提示开发者,然后开发者就可以依据提示前往该视图控制器uiviewcontroller上修改存在内存泄漏的代码。
[0090]
s5、将封装和实现好的工具类文件uiviewcontroller leaks和nsobject methodswizzling拷贝到ios工程项目,实现内存泄漏预警;
[0091]
具体的,所述步骤s5,包括以下的步骤:
[0092]
s51、将封装和实现好的工具类文件uiviewcontroller leaks和nsobject methodswizzling拷贝到我们需要在开发工程中进行内存泄漏预警的ios工程项目中;
[0093]
s52、在ios工程项目的视图控制器基类文件中,通过引入方法#import"uiviewcontroller leaks.h"将该工具类文件uiviewcontroller leaks引入,即可对所有继承于该控制器基类文件的视图控制器生效;
[0094]
s53、视图控制器在加载时自动执行加载方法 (void)load方法,在该加载方法中通过宏debug判断当前app运行的环境,若为开发模式下,则执行交换方法[selfsy_swizzleinstanceselector:@selector(viewdiddisappear:)swizzleselector:@selector(al_viewdiddisappear:)];
[0095]
s54、当用户离开当前视图控制器时,执行视图控制器的离开的生命周期方法viewdiddisappear,因为在上述步骤s53中已经通过运行时将系统方法和工具类uiviewcontroller leaks文件里的自定义实现方法al_viewdiddisappear进行了交换,所以最终执行al_viewdiddisappear方法;
[0096]
s55、在al_viewdiddisappear方法中,调用所述的内存泄漏检测方法al_checkdeallocationafterdelay,在存在内存泄漏时进行提示,将内存泄漏情况告诉给开发
者,开发者根据类名可以前往对应的类进行内存泄漏问题的解决,避免积累越来越多导致应用闪退,从而达到内存泄漏预警的效果。
[0097]
本发明还提供了一种ios项目内存泄露预警系统,该系统通过所述的ios项目内存泄露预警方法,实现ios项目内存泄漏预警。
[0098]
本发明通过object-c的运行时runtime机制,运行时将系统方法和自定义方法进行交换,在自定义方法里实现内存泄漏的检测和预警,当视图控制器存在内存泄漏时进行预警提示,实现了在开发的过程中就能发现内存泄漏存在的地方,然后对内存泄漏问题进行排查解决,避免积累越来越多导致应用闪退;通过在捕获到这个界面销毁依然存在未销毁对象之后,让其响应一个方法,通过这个方法触发预警提示,预警提示会提示出现了内存泄漏的视图控制器。
[0099]
以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本技术权利要求所限定的范围内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献