记一次小小的优化经历

来源:互联网 发布:知乎 chorm无法登陆 编辑:程序博客网 时间:2024/05/01 23:45

APP使用之后内存不断的暴涨,开始以为是由于内存不够导致的闪退,之后通过各种方式优化了内存占用之后,长期刷页面仍然会有闪退。

于是用Instruments检测了一些内存泄露,根据Instruments上的提示,修改了两处比较严重的内存泄露代码。

这两处主要是由于使用了工具类,在工具类中返回对象,由于多次引用,导致其new出了非常多的同一个对象。

其中就包括AFNetWorking的新建,由于工具类代码中没有使用单例模式,导致了内存泄露。

采用单例模式将其修改为如下即可:

+(AFHTTPSessionManager *)getAFNetManager{

    static AFHTTPSessionManager *manager;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{

        //返回类型为data

        manager = [AFHTTPSessionManager manager];

        manager.responseSerializer = [AFHTTPResponseSerializer serializer];

        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json"@"text/json"@"text/javascript",@"text/html",nil];

        [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];

        manager.requestSerializer.timeoutInterval = 20;

    });

    return manager;

}

在工具类中最好不要使用return object的方式,如果有需要,也一定要使用单例模式,否则多处应用极有可能导致内存泄露。



还有就是block的循环引用导致的问题,最好要在block中使用self的地方使用__block和@weakfity @strongfity

__weak typeof(self)weakself = self;



之后根据验证发现,其实APP的内存可以占用到极大,如下图所示,将其内存刷到400MB程序仍然没有崩溃,系统会选择性的去清理other processes,使其有足够空间。但是当产生内存泄露时,可能Memory在很小的情况下也会崩溃


其实上面之所以能将内存刷到这么大,并不是特意写的代码而为,而是通过不断的访问WebView所导致的。这也是之后发现的问题,UIWebView自带内存泄露,不管怎么清都清不掉,在viewDidDisAppler方法中使用了各种方式将WebView清理掉,但是都没有效果。这其中应该是有办法将其清理掉的,但是我还是采取了iOS8推出的WKWebView来替代掉WebView。使用之后发现效果还不错,起初访问项目的一个网页,内存暴涨100MB,如图:


但是之后采用WKWebView之后,就稳定了很多,如图

好吧,太粗心了,也是项目实在太赶,才会出现这种问题。在平常测试的时候还是自己要多测试代码性能的。



幸好我们的项目只支持iOS8以上,要不然就要做适配了。



1 0