Terminated due to memory issue-内存泄漏和暴增问题

总结一下,昨天项目中遇到的问题。
昨天APP在内存比较小的手机上经常闪退,Terminated due to memory issue或者Terminated due to signal 9。这是因为内存的原因闪退。后面用Instruments查看,发现有很多内存泄漏的地方,而且最高的时候,内存甚至达到了500M左右。

内存泄漏

然后用Instruments定位到,内存泄漏基本上都是因为AFNetworking引起的。

--解决办法:
在自己的网络层对AFNetworking封装一个单例就好了,不要每次请求一个网络就[AFHTTPSessionManager manager]一次,那样会造成严重的内存泄漏。

#import "LCAFHTTPSessionManager.h"

@implementation LCAFHTTPSessionManager

static AFHTTPSessionManager *_manager = nil;

+ (AFHTTPSessionManager *)sharedHTTPSession{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_manager == nil) {
            _manager = [AFHTTPSessionManager manager];
            _manager.requestSerializer.timeoutInterval = 15;
            _manager.responseSerializer = [AFJSONResponseSerializer serializer];
            _manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"charset=utf-8", @"text/plain", nil]; // 设置content-Type为text/html
        }
    });
    return _manager;
}

@end

内存暴增

当然内存暴增的原因有很多,一般都是循环引用造成的,一直在创建,但是又没有释放等。
我这里内存暴增,最后主要是因为GIF图片引起的,而我使用的是SDWebImage中加载GIF动画的sd_animatedGIFNamed方法,使本来所占内存只有几十M的会暴增到将近500M。

--解决办法:
换个加载GIF的三方库就好了。推荐两个:FLAnimatedImage和YLGIFImage。这两个都非常轻量级,使用的时候也很简单,需要将ImageView和Image两个的头文件都导入。

  • FLAnimatedImage
//        NSURL *url1 = [[NSBundle mainBundle] URLForResource:@"未读公告动画" withExtension:@"gif"];
//        NSData *data1 = [NSData dataWithContentsOfURL:url1];
//        FLAnimatedImage *animatedImage1 = [FLAnimatedImage animatedImageWithGIFData:data1];
FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif"]]];
FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init];
imageView.animatedImage = image;
imageView.frame = CGRectMake(0.0, 0.0, 100.0, 100.0);
[self.view addSubview:imageView];
  • YLGIFImage
YLImageView* imageView = [[YLImageView alloc] initWithFrame:CGRectMake(0, 160, 320, 240)];
[self.view addSubview:imageView];
imageView.image = [YLGIFImage imageNamed:@"joy.gif"];

最后我两个都试了一下,使用FLAnimatedImage的时候,内存最高达到160多M;而使用YLGIFImage的时候,内存最高达到120多M。都比原来使用SDWebImage要低很多。

你可能感兴趣的:(Terminated due to memory issue-内存泄漏和暴增问题)